前一段時間在寫遊戲裡的**介面,會用到計時器,所以學了一點關於lua中關於協程的用法,記錄下來給大家分享
首先我們要了解一下協程的生命週期,乙個協程有四種狀態:掛起(suspended),執行(running),死亡(dead)和正常(normal)
我們先建立乙個簡單的協程:
local co = coroutine.create(function() print("helloworld") end)
print(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
第一行**我們建立乙個乙個包含函式的協程,第二行**列印該協程,第三行**列印協程狀態,第四行執行協程,第五行再次列印狀態,我們看一下輸出:
thread: 00a1d210
suspended
helloworld
dead
可以看出,直接列印協程可以得到乙個執行緒的位址,也就是該協程的位址。然後協程建立出來時,預設是掛起狀態,使用resume可以執行該協程。然後在執行完協程函式以後,協程的狀態為死亡。
看到這裡,其實還完全沒有看出協程相對於普通函式的優勢,反而看起來更加繁瑣。那是因為我們沒有用到它的yield()函式,我們可以再看乙個例項:
local co = coroutine.create(function()
for i=1,10 do
print("co",i)
coroutine.yield(i)
endend)
coroutine.resume(co)
print(coroutine.status(co))
在協程函式中,我們用for迴圈依次輸出了1到10 的值,其中用到了yield()函式。
我們看一下輸出:
co 1
suspended
迴圈在執行一次之後就被暫停了,我們繼續執行resume函式,可以依次得到輸出
co 2
co 3
co 4
......
co 10
注意,當執行完第十次以後,協程進入死亡,不能再resume,如若不然會報錯。
至此,我們了解到,協程相對於普通的函式在於能在**中控制函式進度,這也是協程的優勢所在。
參考文章:roberto ierusalimschy—《lua程式設計》
Lua協程例子
lua的協程是好東西,跟unity的協程還是不太一樣,下面寫了乙個例子,直接上 co coroutine.create function body print hi coroutine end print type co print coroutine.status co coroutine.res...
Lua 程式設計 協程
乙個協程 coroutine 與執行緒 thread,這裡指 多執行緒 中的執行緒 類似 它是乙個執行序列,擁有自己的棧,區域性變數,指令指標,但是與其他的協程共享全域性變數和其他大部分東西。從概念上講,協程與執行緒最大的區別是 在乙個多處理器機器上,乙個多執行緒程式可以並行地執行多個執行緒。而協程...
Lua學習 協程
print 協同程式 print 協程的建立 常用方式 coroutine.create fun function print 123 end co coroutine.create fun 協程的本質是乙個執行緒物件 print co print type co coroutine.wrap co...