Lua中使用協程

2021-08-28 05:27:05 字數 1289 閱讀 1003

前一段時間在寫遊戲裡的**介面,會用到計時器,所以學了一點關於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...