1. 程式人生 > >Lua 協程

Lua 協程

協程

        多執行緒 就像是實時對戰遊戲,同一時間兩名玩家可以同時運動。協程 就像是棋牌遊戲,表面上是兩個同時在玩,實際上只是兩個人交替執行,同一時間只有一名玩家可以活動。所以協程不會存在死鎖等多執行緒特有的問題。協程可以通過順序流的程式碼進行模擬,就像自己跟自己下棋,先走一步,然後坐到對面走一步,再坐回來(精分?)......多執行緒如果底層不支援的話是沒法模擬的。所以協程更像是一種高階的語法糖,把一個人的步驟分到兩個人身上執行,這樣使程式碼看起來更加條理。

-- 建立 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
]]