如何在函数外停止 Lua 协程?

我正在尝试创建一个调度程序,用于调度多个协程。调度程序需要暂停协程,但我无法弄清楚如何实现。

更新 我想暂停协程而不是杀死它。

点赞
用户1442917
用户1442917

你可以通过在协同程序上设置调试钩子来终止协同程序,该钩子将从中调用 error()。下一次调用钩子时,它将触发 error() 调用,这将中止协同程序:

local co = coroutine.create(function()
  while true do print(coroutine.yield()) end
end)
coroutine.resume(co, 1)
coroutine.resume(co, 2)
debug.sethook(co, function()error("almost dead")end, "l")
print(coroutine.resume(co, 3))
print(coroutine.status(co))

这将打印:

2
3
false   coro-kill.lua:6: almost dead
dead
2017-06-13 18:00:10
用户13447666
用户13447666

通过使用 debug.sethook(co, function() return true end, "y") 设置的钩子返回 true 时的库。

该库足以创建多任务 Lua 系统,只需在代码的最开始运行 require("yieldhook") 即可。更多信息请访问 https://github.com/evg-zhabotinsky/yieldhook

2020-12-01 11:06:11
用户14311009
用户14311009

使用 coroutine.yield(coroutine-you-want-to-pause) 暂停你想要暂停的协程。

2021-07-30 15:48:19