Lua協同プログラムcoroutine

11554 ワード

前言
Lua協同プログラム:別の論理処理を開くc#と同様に、同じ時間に1つの協同プログラムしか実行できないスレッド:同じ時間に複数のスレッドが実行できるプロセス:スレッドの1つのキャリア、1つのプログラムの実行は独立して1つのプロセスであり、プロセスとプロセスの間にはそれぞれ独立したメモリユニットがあり、1つのプロセスは複数のスレッド、複数のスレッド間でストレージユニットを共有します.例えば、携帯電話のゲームを開くと、このゲームにはプロセスがあり、ゲーム内部には多くのスレッドが同時に実行され、スレッドには共有ユニットがあり、記憶データを取得します.
Luaの協同プログラムのすべての関数はcoroutineというテーブル(table)に置かれているLuaの協同プログラムの4つの状態:実行、停止、死亡、正常
一、coroutine.create協同プログラムの作成
協同プログラムを作成します.create関数パラメータビット数1つの関数です.このパラメータは協同プログラムの作業関数です.パラメータ関数は一般的に匿名関数create関数に戻り値->協同プログラムがあります.
local  c1 = coroutine.create(function()
    print("      ")
end)

二、coroutine.statusステータスの表示
協同プログラムの作成後、デフォルトはsuspended保留状態であり、協同プログラムの実行が完了するとdead死亡状態になる.
local  c1 = coroutine.create(function()
    print("      ")
end)
print(coroutine.status(c1)) --suspended   

三、coroutine.resume協同プログラムの実行(協同プログラムの開始)
local  c1 = coroutine.create(function()
    print("      ")
end)
print(coroutine.status(c1)) --suspended   
coroutine.resume(c1) --      (      )
print(coroutine.status(c1)) -- dead     

四、yield()掛け
yieldとc#の差は多くなく、協同プログラムを停止し、条件が満たされたら引き続き下へ実行する.
local c2 = coroutine.create(function()
    for i = 1 ,2 do
        print(i)
        coroutine.yield() --   ,    
        print("go on") --     go on     
    end
end)
coroutine.resume(c2)
print("LS")  --      
print(coroutine.status(c2)) --     
coroutine.resume(c2) --          ,     
print(coroutine.status(c2)) --     
coroutine.resume(c2) --         (    2 )
print(coroutine.status(c2)) -- dead    

五、resume:メソッドには2つの戻り値がある
1.協同プログラムが正しく実行されているか(正しいtrue、エラーfalse)2.エラー原因(nillが正しく返され、stringがエラーで返されます)
local c3 = coroutine.create(function()
    print("    ")
    error("        ")--    ,     :        
end
)
local result ,err = coroutine.resume(c3)
print(result)
print(err) --         ,              

六、resume:協同プログラム関数にパラメータがある
local c4 = coroutine.create(function(name,age)
    print(name)
    print(age)
end
)
coroutine.resume(c4,"Young",333) --                 

七、resume:関数の2番目の戻り値
協同プログラムにエラーが発生した場合、2番目の戻り値がエラー情報で協同プログラムにエラーが発生しなかった場合、2番目の戻り値はyield関数のパラメータです.
local c5 = coroutine.create(function()
    print("lua")
    --error("    ") --      
    coroutine.yield("      ") --      
end)

local result, err = coroutine.resume(c5)
print(result)
print(err) --     yield   :      

八、yield関数の戻り値はrusume関数の2番目のパラメータである
上の例は、yield関数のパラメータがresume関数の2番目の戻り値であると言えるが、今の例では、yield関数の戻り値がresume関数の2番目のパラメータであることがやや複雑であり、例によって理解できる
local c6 = coroutine.create(function(name)
    local b = coroutine.yield("   rusume  ")
    print(b)--  A
end)
coroutine.resume(c6,"Y") --   "Y"         name     ,       yield   
coroutine.resume(c6,"A") --           ,       ”A“  yiled      

九、協同プログラム中の関数に戻り値がある
協同プログラムの関数の最初の戻り値はresume関数の2番目の戻り値に与えられます.次に協同プログラムを実行し続けます.resume関数の戻り値はtrue nil abc hello luaの順です.
local c7 = coroutine.create(function()
    coroutine.yield("      ")
    return nil, "abc", "hello lua"
end)

local result ,err = coroutine.resume(c7)
print(result) -- true
print(err) --       
local result , err, ret1, ret2 = coroutine.resume(c7)
print(result) -- true
print(err)  -- nil
print(ret1) --abc 
print(ret2) --hello lua

公式ドキュメントのケース
公式ドキュメントの例を読み返し、yield関数のパラメータがresume関数の2番目の戻り値であることを理解し、(1番目の戻り値がtrue)resume関数の2番目のパラメータがyield関数の戻り値であることを理解します(1番目のパラメータは協同プログラム変数(関数)名です).
function foo (a)
    print("foo", a)
    return coroutine.yield(2*a)
end

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

print("main", coroutine.resume(co, 1, 10))
print("main", coroutine.resume(co, "r"))
print("main", coroutine.resume(co, "x", "y"))
print("main", coroutine.resume(co, "x", "y"))

印刷結果:When you run it,it produces the following output:
 co-body 1       10
 foo     2
 main    true    4
 co-body r
 main    true    11      -9
 co-body x       y
 main    true    10      end
 main    false   cannot resume dead coroutine