參考:lua中的協同程式 coroutine
協同程式(coroutine):
三個狀態:suspended(掛起,協同剛建立完成時或者yield之後)、running(執行)、dead(函式走完後的狀態,這時候不能再重新resume)。
coroutine.create(arg):根據乙個函式建立乙個協同程式,引數為乙個函式
coroutine.resume(co):使協同從掛起變為執行(1)啟用coroutine,也就是讓協程函式開始執行;(2)喚醒yield,使掛起的協同接著上次的地方繼續執行。該函式可以傳入引數
coroutine.status(co):檢視協同狀態
coroutine.yield():使正在執行的協同掛起,可以傳入引數
優點:可以通過resume-yield來交換資料
示例**一:
消費者驅動的生產者-消費者模型
producefunc = function()while true do
local value = io.read()
print("produce: ", value)
coroutine.yield(value) -- 返回生產的值給coroutine.resume()
endendconsumer = function(p)
while true do
local status, value = coroutine.resume(p); -- 喚醒生產者進行生產,並接受coroutine.yield()的值進行消費
print("consume: ", value)
endend-- 消費者驅動的設計,也就是消費者需要產品時找生產者請求,生產者完成生產後提供給消費者
producer = coroutine.create(producefunc)
consumer(producer)
在生產消費環節之間加入乙個中間處理的環節(過濾器):
producefunc = function()while true do
local value = io.read()
print("produce: ", value)
coroutine.yield(value) -- 返回生產的值
endendfiltefunc = function(p)
while true do
local status, value = coroutine.resume(p);
value = value *100 -- 放大一百倍
coroutine.yield(value)
endendconsumer = function(f, p)
while true do
local status, value = coroutine.resume(f, p); -- 喚醒生產者進行生產
print("consume: ", value)
endend-- 消費者驅動的設計,也就是消費者需要產品時找生產者請求,生產者完成生產後提供給消費者
producer = coroutine.create(producefunc)
filter = coroutine.create(filtefunc)
consumer(filter, producer)
示例**二:
生產者驅動的生產者-消費者模型
local co_yield = coroutine.yieldlocal co_create = coroutine.create
local co_status = coroutine.status
local co_resume = coroutine.resume
consumefunc = function()
for i = 1,10 do
local value = co_yield() -- 通過coroutine.yield()來接收 coroutine.resume()傳遞的值
print("consume: ",value)
endendproducefunc = function(consumer)
for i = 1,10 do
local value = io.read()
print("produce: ",value)
co_resume(consumer, value) -- 喚醒消費者進行消費
endendconsumer = co_create(consumefunc)
co_resume(consumer) -- 喚醒消費準備開始消費
producefunc(consumer)
注意:在啟動coroutine的時候,resume的引數是傳給主程式的;在喚醒yield的時候,引數是傳遞給yield的
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...