1. 程式人生 > 其它 >Lua五:協程

Lua五:協程

Lua的協程很像系統中的執行緒,也是一個獨立的執行線。不同之處是,執行緒是並行執行的,而協程是協作式的,即同一時刻只有一個協程在執行,並且只有它自己顯式請求掛起時,執行權才會轉換。協程是一系列的可執行語句,擁有自己的棧、區域性變數和指令指標,同時協程又與其他協程共享了全域性變數和其他幾乎一切資源。Lua語言提供的是所謂的非對稱協程(asymmetric coroutine), 也就是說需要兩個函式來控制協程的執行,一個用於掛起協程的執行,另一個用於恢復協程的執行。而其他一些語言提供的是對稱協程( symmetric .coroutine),只提供一個函式用於在一個協程和另一個協程之間切換控制權。

一個協程有以下四種狀態,即掛起(suspended)、 執行(running)、 正常(normal) 和死亡(dead)。

Lua語言中協程相關的所有函式都被放在表coroutine中。

1、函式create用於建立新協程,該函式只有一一個引數,即協程要執行的程式碼的函式(協程體(body))。 函式create返回一個「thread」型別的值,即新協程。通常,函式create的引數是一一個匿名函式,例如:

co = coroutine. create(function () print("hi") end)

print(type(co)) --> thread

2、我們可以通過函式corout ine. status來檢查協程的狀態:

print( coroutine. status(co)) - ->suspended

3、當一個協程被建立時,它處於掛起狀態,即協程不會在被建立時自動執行。函式coroutine. resume用於啟動或再次啟動一個協程的執行,並將其狀態由掛起改為執行:

coroutine. resume(co) --> hi

在上例中,協程體只是簡單地列印了「hi」後便終止了,然後協程就變成了死亡狀態:

print( coroutine. status(co)) --> dead

當匿名函式需要引數時,引數依次填入resume括號中,如:

co = coroutine. create(function (a, b,c)

print("co",a, b, c + 2)

end)

coroutine.resume(co,1, 2, 3) -->co 1 2 5

4、coroutine.yield (···)使正在執行的函式掛起。Lua語言中一個非常有用的機制是通過一對resume -yield來交換資料。在函式coroutine. resume的返回值中,第一個返回值為true 時表示沒有錯誤,之後的返回值對應函式yield 的引數。與之對應的是,函式coroutine. yield的返回值是對應的resume 的引數。

co = coroutine. create(

function (a,b)

local c=a

a=b

b=c

print(a,b,”\n”)

coroutine.yield (a+b,b-a)

end)

print( coroutine. resume(co,20, 10)) --> 10 20

true 30 10