Lua協程實現原理

2021-10-17 23:21:58 字數 2668 閱讀 8571

api 傳入引數 返回值 說明

api傳入引數

返回值說明

create(f)

函式,作為協程執行的主函式

返回建立的協程

如果還需要執行,需要使用resume操作

resume(co,[val1,…])

傳入第乙個引數是create函式返回的協程,剩下的引數是傳遞給協程執行的引數。

分兩種情況,resume成功的情況下返回true以及上一次 yield函式傳入的引數;失敗情況下返回false,以及錯誤資訊 第一次執行resume操作時,會從create傳入的函式開始執行,之後會在該協程主函式呼叫yield的下乙個操作開始執行,直到整個函式執行完畢。

第一次執行resume操作時,會從create傳入的函式開始執行,之後會在該協程主函式呼叫yield的下乙個操作開始執行,直到整個函式執行完畢。呼叫resume操作必須在主線程中。

runing

空返回當前正在執行的協程,如果在主線程中被呼叫,將返回nil

status

空返回當前協程的狀態,有dead,running,suspend,

dead:死亡,runing:正常執行,suspend:掛起

wrap

與create類似,傳入協程執行的主函式

返回建立的協程

wrap函式相當於結合了create和resume函式,所不同的是,wrap函式返回的是建立好的協程,下一次直接傳入引數呼叫該協程即可,無需呼叫resume函式。

yield

變長引數,這些是返回,給此次resume函式的返回值。

返回下乙個resume操作傳入的引數值

掛起當前協程的執行,呼叫yield操作,必須在協程中。

function

foo(a)

print

("foo 函式輸出"

, a)

return coroutine.

yield(2

* a)

-- 返回 2*a 的值

end

co = coroutine.

create

(function

(a , b)

print

("第一次協同程式執行輸出"

, a, b)

-- co-body 1 10

local r =

foo(a +1)

print

("第二次協同程式執行輸出"

, r)

local r, s = coroutine.

yield

(a + b, a - b)

-- a,b的值為第一次呼叫協同程式時傳入

print

("第三次協同程式執行輸出"

, r, s)

return b,

"結束協同程式"

-- b的值為第二次呼叫協同程式時傳入

end)

print

("main"

, coroutine.

resume

(co,1,

10))-- true, 4

print

("--分割線----"

)print

("main"

, coroutine.

resume

(co,

"r")

)-- true 11 -9

print

("---分割線---"

)print

("main"

, coroutine.

resume

(co,

"x",

"y")

)-- true 10 end

print

("---分割線---"

)print

("main"

, coroutine.

resume

(co,

"x",

"y")

)-- cannot resume dead coroutine

print

("---分割線---"

)

上面測試案例 可以看到lua中的 協程執行原理, 每次 resume,會從主函式裡取 乙個yield,並取得 yield的返回值。每次 取玩,yield就失效了,當沒得取的時候, 協程就已經是死的了。

其中關鍵的就是,resume 和yield 之間的 資料交換。

從 from 協程中移動 n 個到 to 協程中。

建立協程在 函式 luab_cocreate中。

在5.3中協程相關被整合到 lcorolib.c 裡。

而在舊版本中 對應的指令碼位置是在 lbaselib.c

lcorolib.c 5.3

static

int luab_cocreate (lua_state *l)

它做的事情:

lapi.c ,lua_xmove

lua_api void lua_xmove (lua_state *from,lua_state *to,

int n)

lua_unlock

(to)

;}

它主要就是實現了resume和yield函式的引數 兩者之間的協程資料交換。

協程 底層實現原理

1.程序程序是乙個實體,乙個使用者程式就是乙個程序。2.執行緒 3.子程式子程式又被稱為執行體 函式 方法等。子程式在主程式中被呼叫執行。1.協程的產生 2.協程的定義 子程式呼叫總是乙個入口,一次返回,呼叫順序是明確的。而協程的呼叫和子程式不同。比如子程式a b def a print 1 pri...

Lua協程例子

lua的協程是好東西,跟unity的協程還是不太一樣,下面寫了乙個例子,直接上 co coroutine.create function body print hi coroutine end print type co print coroutine.status co coroutine.res...

Lua 程式設計 協程

乙個協程 coroutine 與執行緒 thread,這裡指 多執行緒 中的執行緒 類似 它是乙個執行序列,擁有自己的棧,區域性變數,指令指標,但是與其他的協程共享全域性變數和其他大部分東西。從概念上講,協程與執行緒最大的區別是 在乙個多處理器機器上,乙個多執行緒程式可以並行地執行多個執行緒。而協程...