Lua 调试钩子似乎阻止协程工作

所以,我正在尝试在 Lua 中构建一个多任务系统,定期将控制权交回到主线程。 问题在于,debug.sethook 似乎会在将其设置为调用 coroutine.yield 时立即导致协程死亡。

将其设置为执行其他操作似乎可以正常工作。

o=coroutine.create(function()
   print("Hello")
   print("goodbye")
end)
debug.sethook(o,coroutine.yield,"l",1)
coroutine.resume(o)--这里没有任何输出
print(coroutine.status(o))--输出为 dead.

我做错了什么?

编辑:即使在接近最小的上下文中也会发生这种情况,因此我简化了示例代码。

点赞
用户1442917
用户1442917

如果你打印resume调用的结果,你会看到类似false attempt to yield across a C-call boundary的东西,所以执行会失败,因为你正在尝试从调试钩子中yield,这是不允许的(你需要从调试钩子中返回)。 你可以从调试钩子中resume进入不同的协程,然后从那里yield,但是你不能从钩子中yield。

如果你解释一下你要做什么的话,也许可以推荐一种不同的解决方案(在编辑中)。

2019-02-26 00:31:59
用户1262557
用户1262557

我最终做的是,因为这种方法似乎是错误的,是我在阅读lua信号处理和这封email thread时发现的。

本质上,我必须设置一个posix定时器,以便在我希望中断执行以切换到另一个协程之时,向我的进程发送信号,并为相关线程状态设置钩子以调用lua_yield。

这使我能够模拟一些我寻找的多处理功能,并且非常快,这非常好。

2019-02-26 01:53:32
用户13447666
用户13447666

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

这个库足以创建多任务 Lua 系统,在你的代码非常开始处运行 require("yieldhook"),在 git 上获取更多信息。

https://github.com/evg-zhabotinsky/yieldhook

2020-11-01 04:07:37