lua學習筆記13 協程具體解釋和舉例

2021-09-07 10:25:50 字數 2868 閱讀 2048

一、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 就以 ...