[Lua]コンシステント

7200 ワード

参照リンク:
https://www.runoob.com/lua/lua-coroutine.html
https://www.jb51.net/article/64691.htm
 
一.一般的な方法
1.coroutine.create()作成コヒーレンス
2.coroutine.resume()リカバリコヒーレンス
3.coroutine.yield()フック
4.coroutine.status()はコンシステントの状態を返します
 
テスト:
co = coroutine.create(function ()
    for i = 1, 10 do
        print(i)
        coroutine.yield()
    end
end)

coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)

---- 1
-- 2
-- 3

 
二.共通のステータス
1.suspended保留状態.コヒーレント(create)とサスペンション(yield)を作成すると、コヒーレントはサスペンション状態になります.
2.running運転状態.コンシステント(resume)を復元すると、コンシステントは実行されます.
3.dead停止状態.コンカレント運転終了後停止状態
 
テスト:
co = coroutine.create(function ()
    print(coroutine.status(co))
    print("hi")
end)

print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))

---- suspended
-- running
-- hi
-- dead

 
三.resumeとyield間のデータ交換
1.resumeを呼び出すと、コヒーレントの開始または保留中から実行されます.次のように、resumeを初めて実行すると、パラメータ1,2,3が直接コヒーレントに渡されます.2回目の実行resumeは、保留中から実行され、パラメータ4,5,6がyieldに渡され(次の例2参照)、このとき再びprintが印刷され、初めてコモンに渡されたパラメータが印刷される
co = coroutine.create(function (a, b, c)
    print("co", a, b, c)
    coroutine.yield()
    print("co2", a, b, c)
end)
coroutine.resume(co, 1, 2, 3)
coroutine.resume(co, 4, 5, 6)

---- co    1    2    3
-- co2    1    2    3

 
2.上記の例を少し修正します.yieldの戻り値がresumeのパラメータであることがわかります
co = coroutine.create(function (a, b, c)
    print("co", a, b, c)
    print(coroutine.yield())
    print("co2", a, b, c)
end)
coroutine.resume(co, 1, 2, 3)
coroutine.resume(co, 4, 5, 6)

---- co    1    2    3
-- 4    5    6
-- co2    1    2    3

 
3.上記の例を再度少し修正します.resumeの戻り値はtrueとyieldのパラメータであり、trueは実行に成功したことを示し、エラーが発生した場合falseとエラー情報を返す.
co = coroutine.create(function (a, b, c)
    print("co", a, b, c)
    print(coroutine.yield("haha", 999))
    print("co2", a, b, c)
end)
print(coroutine.resume(co, 1, 2, 3))
print(coroutine.resume(co, 4, 5, 6))

---- co    1    2    3
-- true    haha    999
-- 4    5    6
-- co2    1    2    3
-- true

 
4.resumeの戻り値はtrueとreturnの値であってもよい.returnとyieldの違いは、yield後コヒーレンスが保留状態(suspended)であり、return後コヒーレンスが停止状態(dead)であることである.
co = coroutine.create(function ()
    return 6, 7
end)
print(coroutine.resume(co)) 
print(coroutine.resume(co))

---- true    6    7
-- false    cannot resume dead coroutine

 
まとめ:
resumeとyieldの協力の強さは、resumeがプライマリ・パスにあり、外部状態(データ)を協同プログラムの内部に伝達することである.一方yieldは内部の状態(データ)をメインパスに返す.