Lua 協程
阿新 • • 發佈:2018-11-10
協程
多執行緒 就像是實時對戰遊戲,同一時間兩名玩家可以同時運動。協程 就像是棋牌遊戲,表面上是兩個同時在玩,實際上只是兩個人交替執行,同一時間只有一名玩家可以活動。所以協程不會存在死鎖等多執行緒特有的問題。協程可以通過順序流的程式碼進行模擬,就像自己跟自己下棋,先走一步,然後坐到對面走一步,再坐回來(精分?)......多執行緒如果底層不支援的話是沒法模擬的。所以協程更像是一種高階的語法糖,把一個人的步驟分到兩個人身上執行,這樣使程式碼看起來更加條理。
-- 建立 coroutine co2 = coroutine.create( function() for i=1,3 do ret = coroutine.yield() -- 暫停 print(ret) end end ) coroutine.resume(co2) coroutine.resume(co2, 11) --11 coroutine.resume(co2, 22) --22 -- 檢視狀態 print(coroutine.status(co2)) -- 檢視執行緒號 print(coroutine.running()) -- 執行順序 co = coroutine.wrap( function(i) print(i); --2 a = coroutine.yield() --3 print(a); --5 b = coroutine.yield() --6 print(b); end ) co('a') --1 co('b') --4 co('c') --7 --引數傳遞過程 co = coroutine.create( function() for i=1,3 do y = coroutine.yield("讓出 "..i)--2 6 10 print(y)-- 5 9 end end ) for i=1,3 do _, r = coroutine.resume(co, "接管 "..i)--1 4 8 print(r) --3 7 11 end --[[ 讓出1 接管2 讓出2 接管3 讓出3 ]]