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