lua協程再探

2021-07-25 03:36:26 字數 1456 閱讀 4153

lua語言的協程中yield關鍵字可以掛起當前coroutine執行,並暫時儲存臨時變數值,該值即是第二次呼叫 resume 時傳入的引數!

co = coroutine.create(function

(value1,value2)

local tempvar3 =10

print("coroutine section 1", value1, value2, tempvar3)

local tempvar1 = coroutine.yield(value1+1,value2+1)

tempvar3 = tempvar3 + value1

print("coroutine section 2",tempvar1 ,tempvar2, tempvar3)

local tempvar1, tempvar2= coroutine.yield(value1+value2, value1-value2)

tempvar3 = tempvar3 + value1

print("coroutine section 3",tempvar1,tempvar2, tempvar3)

return value2, "end"

end)

print("main", coroutine.resume(co, 3, 2))

print("main", coroutine.resume(co, 12,14))

print("main", coroutine.resume(co, 5, 6))

print("main", coroutine.resume(co, 10, 20))

1.首先,我們建立了乙個協程並將其賦給變數 co。此協程允許傳入兩個引數。

2.第一次呼叫函式 resume 時,協程內區域性變數 value1 和 value2 的值分別為 3 和 2。

3.為了便於理解,我們使用了區域性變數 tempvar3 該變數被初始化為 10。由於變數 value1 的值為3,所以 tempvar3 在隨後的協程呼叫過程中被先後更新為 13 和 16。

4.第一次呼叫 coroutine.yield 時,為 resume 函式返回了值 4 和 3,這兩個值是由傳入的引數 3,2 分別加 1 後的結果,這一點可以從 yield 語句中得到證實。除了顯示指定的返回值外,resume 還收到隱式的返回值 true,該值表示協程執行的狀態,有 true 和 false 兩個可能取值。

5.上面的例子中,我們還應該關注在下一次呼叫 resume 時如何為協程傳入引數。從例子中可以看到,coroutine.yield 函式返回後為兩個變數賦值,該值即是第二次呼叫 resume 時傳入的引數。這種引數傳遞的機制讓可以結合前面傳入的引數完成很多新的操作。

6.最後,協程中所有語句執行完後,後面的呼叫就會返回 false 狀態,同時返回 "cannot resume dead coroutine"訊息。

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...