Lua的協程基礎

2022-03-13 07:44:01 字數 2629 閱讀 1578

參考: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.yield

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