Lua_協同プログラム_011


Lua協同プログラム(coroutine)はスレッドと比較して類似している:独立したスタック、独立した局所変数、独立した命令ポインタを持ち、同時に他の協同プログラムとグローバル変数と他の大部分のものを共有する.
協同は非常に強力な機能ですが、使い勝手も複雑です.
スレッドとスレッドの違い
スレッドと協同プログラムの主な違いは、複数のスレッドを有するプログラムが複数のスレッドを同時に実行することができ、協同プログラムは互いに協力して実行する必要があることである.
いずれかの指定された時点で1つの協同プログラムのみが実行され、この実行中の協同プログラムは、明確に要求された保留時にのみ保留されます.
協同プログラムは同期したマルチスレッドに似ていて、同じスレッドロックを待っているいくつかのスレッドは少し協同しています.
メソッドの説明create()coroutineを作成し、coroutineを返します.パラメータは関数で、resumeと組み合わせて使用すると、関数呼び出しcoroutineが起動します.resume()coroutineを再起動し、createと協力してcoroutineを使用します.yield()はcoroutineを掛け、coroutineを掛け状態に設定します.これはresumeと組み合わせて多くの役に立つ効果があります.status()coroutineのステータスの表示
注意:coroutineの状態は3種類あります:dead、suspend、running、具体的にいつこのような状態があるかは以下のプログラムcoroutineを参照してください.wrap()coroutineを作成し、関数を返します.この関数を呼び出すとcoroutineに入り、create機能とcoroutineを繰り返します.running()は走っているcoroutineを返し、1つのcoroutineはスレッドであり、runningを使用するとcoroutingのスレッド番号を返します.
例1
co = coroutine.create(
function (xxx) 
  print(xxx)
end)

print(coroutine.status(co));
coroutine.resume(co,"hello")
print(coroutine.status(co));


print("----------")

co = coroutine.wrap(
    function(i)
        print(i);
    end
)

co(1)

print("----------")

co2 = coroutine.create(
    function()
        for i=1,10 do
            print(i)
            if i == 3 then
                print(coroutine.status(co2))  --running
                print(coroutine.running()) --thread:XXXXXX
            end
            coroutine.yield()
        end
    end
)

coroutine.resume(co2) --1
coroutine.resume(co2) --2
coroutine.resume(co2) --3

print(coroutine.status(co2))   -- suspended
print(coroutine.running())

print("----------")

 coroutine.running      ,coroutine           。

 create  coroutine                 。

   resume       ,create coroutine       ,   yield            ,    resume    。 

例2
function foo (a)
    print("foo     ", a)
    return coroutine.yield(2 * a) --     2*a   
end

co = coroutine.create(function (a , b)
    print("           ", a, b) -- co-body 1 10
    local r = foo(a + 1)  --r              

    print("           ", r)
    local r, s = coroutine.yield(a + b, a - b)  -- a,b               

    print("           ", r, s)    --r,s              

    return b, "      "                   -- b               
end)

print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--   ----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---   ---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---   ---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---   ---")


        :

      resume,       ,resume      truefalse;
          ;
       yield  ;
    yield      ,   resume  ;(  :  yield  ,   resume   )
       resume,        ;(  :  resume    ,       ,        yield   )
    yield  ;
            ;
                         resume     :cannot resume dead coroutine

resume yield         ,resume     ,      (  )         ; yield       (  )      。