• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Lua笔记7coroutine

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1. 使用

co = coroutine.create(function() print("hi") end)  --创建
coroutine.status(co) -- 获取状态, suspended
coroutine.resume(co) -- 运行
coroutine.status(co) -- 获取状态, dead


2.resume是在保护模式下运行的,所以错误信息是通过co的返回值来处理的

co = coroutine.create(function()
for i=1,2 do
print("co", i)
coroutine.yield() -- 挂起程序
end
end)
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- co 1
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- co 2
print(coroutine.status(co)) -- suspended
print(coroutine.status(co)) -- dead
print(coroutine.resume(co)) -- false cannot resume dead coroutine

3. resume-yield交换数据

1) 第一次调用resume, 传给resume的参数就是传给co主程序的参数

co = coroutine.create(function(a, b)
print(a, b)
end)

coroutine.resume(co, 1,2) -- true
--
co 输出 1, 2

2) 之后调用resume, yield函数的返回值,是传给co的额外参数

co = coroutine.create(function(a, b)
print("co", coroutine.yield())
end)

coroutine.resume(co)
coroutine.resume(co, 1,2)

 

3) 协同程序结束后,resume的返回值是协同主程序的返回值, 多值返回

co = coroutine.create(function(a, b)
return a+b
end)

print(coroutine.resume(co, 1,2)) -- true 3


4. 管道

function receive(prod)
local status, value = coroutine.resume(prod)
return value
end

function send(x)
coroutine.yield(x)
end

function producer()
local i = 0
return coroutine.create(function()
while true do
local x = i
i = i + 1
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)
print("received:" .. x)
end
end

consumer(filter(producer()))






鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
NGINX+Lua模块编译安装发布时间:2022-07-22
下一篇:
Lua的函数调用和协程中,栈的变化情况发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap