一、coroutine.create建立協程
引數是協程的主函式,返回乙個thread物件
co = coroutine.create(function()
print("coroutine execute!")
end)
二、協程狀態
協程有三種狀態:掛起(suspended)、執行(running)和死亡(dead)
coroutine.status(co)返回協程當前的狀態
協程建立完之後處於掛起狀態
print(coroutine.status(co))
輸出:
suspended
三、執行協程
協程執行後。狀態變為running,當協程主所有執行完之後,變為dead狀態
coroutine.resume(co)
print(coroutine.status(co))
輸出:
dead
主函式執行完時。它的返回的值和true一起作為相應resume的返回值
co = coroutine.create(function(a, b)
print("coroutine execute!")
return a + b
end)
print(coroutine.resume(co, 2, 3))
輸出:
ture 5
四、中斷協程
主函式執行過程中遇到coroutine.yield()中斷,再次呼叫resume將從中斷的位置開始執行
co = coroutine.create(function()
for i = 1, 2 do
print("before", i)
coroutine.yield()
print("after", i)
endend)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
輸出:
suspended
before 1
suspended
after 1
before 2
suspended
after 2
dead
假設是被掛起yield函式有傳參,這些引數和true一起作為相應resume的返回值
co = coroutine.create(function(a)
a = a + 1
coroutine.yield(a)
a = a + 1
return a
end)
print(coroutine.status(co))
print(coroutine.resume(co,1))
print(coroutine.status(co))
print(coroutine.resume(co,1))
print(coroutine.status(co))
輸出:
suspended
true 2
suspended
true 3
dead
五、coroutine.wrap建立協程
引數是協程的主函式。返回乙個函式,每當呼叫這個返回函式,都會執行協程主函式。
返回值時yield或主函式的返回值,沒有執行結果布林值和錯誤碼,因此無法檢測出執行時的錯誤。也無法檢查 wrap 所建立的協程的狀態。
function co_func(a)
local c = coroutine.yield(a + 1)
return c * 2
endco = coroutine.wrap(co_func)
ret1 = co(1)
print(ret1)
ret2 = co(10)
print(ret2)
輸出: 2
20執行一次協程物件。協程就會被啟用一次,再次呼叫時從上一次斷點的地方繼續執行。
掛起時yield的引數將作為返回值,再次啟用時的引數將作為yield的返回值。
六、獲得執行中的協程
函式 coroutine.running 用於返回正在執行中的協程,假設沒有協程執行。則返回 nil
print("running:",coroutine.running())
co = coroutine.create(function()
print("running:",coroutine.running())
print("is co:", coroutine.running() == co)
print("status:", coroutine.status(coroutine.running()))
end)
coroutine.resume(co)
print("running:",coroutine.running())
輸出:
running: nil
running: thread: 006dc380
is co: true
status: running
running: nil
Lua學習 協程
print 協同程式 print 協程的建立 常用方式 coroutine.create fun function print 123 end co coroutine.create fun 協程的本質是乙個執行緒物件 print co print type co coroutine.wrap co...
python3協程學習筆記
在此之前,協程對我來說是乙個比較陌生的概念,學習之後,發現其應用場景還是有不少,大師之言 協程能自然地表述很多演算法,例如 遊戲 非同步i o,以及其他事件驅動型邊吃形式活協作式多工。舉例來說,asyncio tornado twisted simpy庫都是基於協程特性在單個執行緒中管理多個併發活動...
Go語言學習筆記 Go協程
併發 concurrency 是指一次處理大量事情的能力。讓我們用乙個 例子來說明。並行 parallelism 指的是同時處理多個事情。雖然聽起來像併發,但是它們是不同的。go 原生支援併發。在go中,使用 go 協程 goroutine 和通道 channel 來處理併發。函式 main 就以 ...