主頁 > 知識庫 > Lua協(xié)同程序函數(shù)coroutine使用實例

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

熱門標(biāo)簽:地方門戶網(wǎng)站 呼叫中心市場需求 網(wǎng)站排名優(yōu)化 百度競價排名 AI電銷 Linux服務(wù)器 服務(wù)外包 鐵路電話系統(tǒng)

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

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

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

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

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

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

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

一個簡單的示例:

復(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ù)制代碼 代碼如下:

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)用 —— 迭代器(類比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

您可能感興趣的文章:
  • Lua協(xié)程(coroutine)程序運行分析
  • Lua的協(xié)程(coroutine)簡介
  • Lua之協(xié)同程序coroutine代碼實例
  • Lua協(xié)同程序(COROUTINE)運行步驟分解
  • Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯
  • 舉例詳解Lua中的協(xié)同程序編程
  • Lua中的協(xié)同程序詳解
  • Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究
  • Lua中的協(xié)同程序探究
  • Lua協(xié)同程序coroutine的簡介及優(yōu)缺點

標(biāo)簽:崇左 衡水 湘潭 蘭州 仙桃 湖南 銅川 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua協(xié)同程序函數(shù)coroutine使用實例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266