Lua 协程有什么用处?为什么这段代码不能如我所愿般工作?
2012-6-19 23:10:12
收藏:0
阅读:132
评论:2
我在理解这段代码时遇到了困难...我原本期望得到类似于线程的输出,其中随机的“nooo”和“yaaaay”间隔打印,但是我发现主线程似乎会在第一次调用coroutine.resume()时被阻塞,因此防止第二个coroutine的启动直到第一个已经yield。
如果这是coroutines的预期操作,它们有什么用途,我如何实现我想要的目标呢?我是否需要为这些coroutines实现自己的调度器以使其异步操作? 因为这看起来很麻烦,所以我可能还不如使用函数!
co1 = coroutine.create(function ()
local i = 1
while i < 200 do
print("nooo")
i = i + 1
end
coroutine.yield()
end)
co2 = coroutine.create(function ()
local i = 1
while i < 200 do
print("yaaaay")
i = i + 1
end
coroutine.yield()
end)
coroutine.resume(co1)
coroutine.resume(co2)
原文链接 https://stackoverflow.com/questions/5128375
点赞
stackoverflow用户1274599
co1 = coroutine.create(
function()
for i = 1, 100 do
print("co1_"..i)
coroutine.yield(co2)
end
end
)
co2 = coroutine.create(
function()
for i = 1, 100 do
print("co2_"..i)
coroutine.yield(co1)
end
end
)
for i = 1, 100 do
coroutine.resume(co1)
coroutine.resume(co2)
end
co1 = coroutine.create(
function()
for i = 1, 100 do
print("co1_"..i)
coroutine.yield(co2)
end
end
)
co2 = coroutine.create(
function()
for i = 1, 100 do
print("co2_"..i)
coroutine.yield(co1)
end
end
)
for i = 1, 100 do
coroutine.resume(co1)
coroutine.resume(co2)
end
2012-03-16 17:24:29
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
协程不是线程。
协程就像从未主动调度的线程。所以你是有点正确的,你需要编写你自己的调度器来让两个协程同时运行。
然而当涉及到协程时,你忽略了更大的局面。查看维基百科的协程常见用途。以下是一个具体的例子,可能会给你指导方向。
——关卡脚本 ——每2分钟火山喷发 function level_with_volcano(interface) while true do wait(seconds(5)) start_eruption_volcano() wait(frames(10)) s = play("rumble_sound") wait(end_of(s)) start_camera_shake() --更多内容 wait(minutes(2)) end end
上面的脚本可以通过
switch
语句和一些巧妙的状态变量编写来循环运行,但它用作协程时更加明显。上述脚本可以是一个线程,但是你真的需要为这个简单的代码专门分配一个内核线程吗?繁忙的游戏关卡可能有数百个这样的协程同时运行,而不会影响性能。然而,如果每个协程都是一个线程,你可能只能用20-30个左右,否则性能就会受到影响。协程的目的是允许我编写在栈上存储状态的代码,以便我可以在一段时间内停止运行它(
wait
函数),然后从我离开的地方重新启动它。