麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Lua協(xié)同程序函數(shù)coroutine使用實(shí)例

2024-07-21 23:04:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

協(xié)程是協(xié)同程序的簡(jiǎn)稱,顧名思義,就是協(xié)同工作的程序。協(xié)程擁有自己獨(dú)立的桟、局部變量和PC計(jì)數(shù)器,同時(shí)又與其他協(xié)同程序共享全局變量和其他大部分東西;

協(xié)程與線程的主要區(qū)別在于,一個(gè)多線程程序可以同時(shí)運(yùn)行幾個(gè)線程(并發(fā)執(zhí)行、搶占),而協(xié)同程序卻需要彼此協(xié)作地運(yùn)行,即一個(gè)多協(xié)程程序在任意時(shí)刻只能運(yùn)行一個(gè)協(xié)程,并且正在執(zhí)行的協(xié)程只會(huì)在其顯式地要求掛起(suspend)時(shí),它的執(zhí)行才會(huì)暫停(無(wú)搶占、無(wú)并發(fā))。

 Lua中所有與協(xié)程相關(guān)的函數(shù)都在coroutine(一個(gè)table)中; 函數(shù)create用于創(chuàng)建新的協(xié)程,只有一個(gè)參數(shù)——要執(zhí)行的函數(shù),返回一個(gè)thread類(lèi)型的值。

thread的狀態(tài):suspend、running、dead、normal,可以通過(guò)coroutine.status(co)來(lái)檢查co的狀態(tài)。

創(chuàng)建一個(gè)thread時(shí),它處于掛起狀態(tài)。coroutine.resume函數(shù)用于啟動(dòng)或再次啟動(dòng)一個(gè)協(xié)程的執(zhí)行,并可以向coroutine傳遞參數(shù)。當(dāng)一個(gè)協(xié)程結(jié)束時(shí),主函數(shù)返回的值將作為resume的返回值。

coroutine.yield用于一個(gè)運(yùn)行中的協(xié)程掛起(suspend),之后可以再恢復(fù)(resume)。yield的返回值就是resume傳入的參數(shù)。

Lua的協(xié)程模型可以類(lèi)比Python的generator。

一個(gè)簡(jiǎn)單的示例:

復(fù)制代碼 代碼如下:

> co = coroutine.create(function(a) while a > 0 do print(coroutine.yield(a)); a = a - 1; end return -1 end)
> return coroutine.resume(co, 3) --- 3是傳遞給主函數(shù)的
true        3
> return coroutine.resume(co, 4)
4
true        2
> return coroutine.resume(co, 5)
5
true        1
> return coroutine.resume(co, 6)
6
true        -1 ---主函數(shù)已經(jīng)返回
> return coroutine.resume(co, 7)
false        cannot resume dead coroutine
>

 

協(xié)程的應(yīng)用 —— 生產(chǎn)者/消費(fèi)者

需求:輸入一行,打印一行

 

復(fù)制代碼 代碼如下:

function send(x)
coroutine.yield(x)
end
 
function receive(co)
local s, v = coroutine.resume(co)
return v
end
 
function producer()
return coroutine.create(function()
while true do
local x = io.read()
send(x)
end
end)
end
 
function filter(prod)
return coroutine.create(function()
for line = 1, math.huge do
local x = receive(prod)
x = string.format('%5d %s', line, x)
send(x)
end
end)
end
 
function consumer(prod)
while true do
local x = receive(prod)
io.write(x, '/n')
end
end
 
prod = producer()
fil = filter(prod)
con = consumer(fil)

協(xié)程的應(yīng)用 —— 迭代器(類(lèi)比Python Generator)
復(fù)制代碼 代碼如下:

function seq_generator(n)
local i = 1
while i <= n do
coroutine.yield(i)
i = i + 1
end
return nil
end
 
function seq(n)
local co = coroutine.create(function() seq_generator(n) end)
return function()
local s,v = coroutine.resume(co)
return v
end
end
 
for i in seq(4) do
print(i)
end

執(zhí)行
復(fù)制代碼 代碼如下:

lua seq_generator.lua
1
2
3
4
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产乱轮视频 | 性爱免费在线视频 | 亚洲国产视频在线 | 二级大黄大片高清在线视频 | 午夜视频在线观 | 精品一区二区在线观看 | 在线观看中文字幕av | 中文字幕精品在线视频 | 亚洲国产精品久久久久久久久久 | 成人免费午夜视频 | 久久精品一级片 | 色诱亚洲精品久久久久久 | 日韩a毛片免费观看 | 视频一区二区中文字幕 | 成人羞羞在线观看网站 | 国产精品久久久久久久久久久久久久久 | 欧美日韩国产成人在线 | 日本aaa一级片 | xxxx69hd一hd72 | 久久免费视频一区 | 欧美日韩在线影院 | 国产精品久久久久久久久久三级 | 亚洲国产高清一区 | 国产精品久久久久无码av | 欧美性久久久 | 国产精品区在线12p 午夜视频色 | 九草网 | 色污视频 | 婷婷中文字幕一区二区三区 | 国产午夜精品一区二区三区视频 | 91成人午夜性a一级毛片 | 亚洲一区二区网址 | 轻点插视频 | 国产精品视频海角社区88 | 天天操天天碰 | 久久精品免费网站 | 精品久久久久久国产三级 | 欧美成人理论片乱 | 欧美黄色小视频 | 久久精品久久精品国产大片 | 欧美人与性禽动交精品 |