也許更好的閱讀體驗
協程簡單理解為可以暫停的線程,但是同一時刻只有一個協程可以處于運行狀態。
文章目錄
- coroutine.create()
- coroutine.resume()
- coroutine.wrap()
- coroutine.yield()
- coroutine.resume()參數傳遞
- resume和yield之間互換數據
coroutine.create()
lua中使用coroutine.create()
創建一個協程,參數是一個函數,返回值為創建的協程,這個協程運行內容就是這個函數了。
協程有三種狀態掛起、運行、停止。
協程剛創建時處于掛起狀態。
可以在代碼中使用coroutine.status()
查看協程狀態。
function foo ()print("i'm running ")
end
co = coroutine.create(foo)
print(coroutine.status(co))
運行結果:
suspended
coroutine.resume()
可以在代碼中使用coroutine.resume()
來喚醒一個被掛起的協程。
運行完畢的協程狀態為停止。
function foo ()print("i'm running ")
end
co = coroutine.create(foo)
coroutine.resume(co)
print(coroutine.status(co))
運行結果:
i'm running
dead
coroutine.wrap()
每次都調用coroutine.resume()有點麻煩。可以使用coroutine.wrap()
像直接調用函數一樣喚醒協程。
function foo ()print("i'm running ")
end
co = coroutine.wrap(foo)
co()
運行結果:
i'm running
coroutine.yield()
可以在函數中使用coroutine.yield()
來掛起協程。
下一次resume會從掛起位置繼續執行。
function foo ()print("i'm running ")coroutine.yield()print("i' running again")
end
co = coroutine.create(foo)
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
運行結果:
i'm running
suspended
i' running again
coroutine.resume()參數傳遞
如果函數有參數,第一次調用coroutine.resume()
時可以傳參。
function say (s)print("i say " .. s)
end
co = coroutine.wrap(say)
co("hello")
運行結果:
i say hello
resume和yield之間互換數據
在第一次調用coroutine.resume()后,coroutine.resume()
可以和coroutine.yield()
互相交換數據。
coroutine.resume()的參數會作為coroutine.yield()函數的結果。
coroutine.yield()的參數會作為coroutine.resume()函數的結果。
function say (s)print("i say " .. s)print(coroutine.yield("let me have a rest"))
end
co = coroutine.wrap(say)
t = co("hello")
print(t)
co("no")
運行結果:
i say hello
let me have a rest
no
這里say()方法我特意這樣寫,就是為了讓讀者直觀感受coroutine.yield()直接掛起協程是什么樣的。
解釋一下,"hello"作為第一次調用co的參數是對應的參數s,運行到coroutine.yield()時掛起協程,并將括號里的"let me have a rest"傳遞給t,"no"作為第二次調用co的參數時是作為coroutine.yield()的返回值。