1. 程式人生 > >Lua中使用協程

Lua中使用協程

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

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程式設計》