1.協同程序的狀態:掛起、運行、死亡、正常
檢查協同程序的狀態:coroutine.status()2.流程:
2.1 創建新的協同程序:coroutine.create():僅有一個參數,就是要創建的協同程序函數。通常這是一個匿名函數。
例如:
co = coroutine.create(function() print("hello") end)
print(co) -->thread: 003CB2B8
print(coroutine.status(co)) -->suspended
2.2 啓動或再次啓動一個協同程序執行:
coroutine.resume():狀態由掛起改爲運行,當程序執行完畢時,狀態轉爲死亡coroutine.resume(co) -->hello
print(coroutine.status(co)) -->dead
2.3 掛起協同程序,之後可以恢復它的運行
coroutine.yield():狀態由運行到掛起
co = coroutine.create(function()
for i = 0, 3 do
print("co",i)
-- 當遇到coroutine.resume()執行程序時才掛起,下次coroutine.resume()從此處恢復運行
coroutine.yield()
end
end)
coroutine.resume(co) -->co 0
print(coroutine.status(co))
coroutine.resume(co) -->co 1
coroutine.resume(co) -->co 2
coroutine.resume(co) -->co 3
3.正常狀態:當一個協同程序A喚醒協同程序B時,A就處於一種特殊的狀態,既非掛起,也非運行,這種狀態是“正常狀態”。
4.resume-yield 交換數據
co = coroutine.create(function(a,b) print("co",a,b) end)
coroutine.resume(co,1,2) -->co 1 2
所以傳遞給resume的額外參數都將視爲協同程序主函數的參數
co = coroutine.create(function() print("co",coroutine.yield()) end)
coroutine.resume(co) -->第一次運行由於掛起在了print函數中,因此,print函數未執行,所以沒有打印“co”
coroutine.resume(co,4,5) -->co 4 5
yield返回的額外值就是對應resume傳入的參數。