我编写了一段代码,在 Lua 中一个接一个地运行多个任务。只有一个循环调用每个函数,然后将输出用于下一个函数,依此类推。 一般情况下是没有问题的,但偶尔也会出现一些错误。在这些情况下,代码将停止工作。
我想要的是监视我的代码。如果在某个时刻出现错误,我可以调用 Plan B 并避免程序中断。
我读过有关 Lua 协程的内容,它似乎就是我正在寻找的内容。如果出现错误,协程将返回错误。
我的问题是我是否可以停止持续时间太长的协程。 Lua 提供了异步协程,所以我认为我无法执行一个函数并同时计算它忙于执行该任务的时间。我做得对吗,或者有没有一种方法可以在某些条件下基本上从外部停止协程?
谢谢
最佳答案
使用 Lua 协程是不可能实现这一点的。 Lua 协程是协作的;它们(本质上)不支持抢占,而这正是您正在寻找的。为了使协程将执行返回给 coroutine.resume
的调用者,它必须通过调用 coroutine.yield
或 error
来“合作”。
正如评论中所指出的,可以设置一个行钩子(Hook) - 甚至一个“指令钩子(Hook)” - 通过在每个新行/每对指令上中断代码来实现仅 Lua 代码的抢占执行并检查是否超时。
一旦你调用(阻塞)C 函数,包括 Lua 标准库函数,它就会停止工作;它仅适用于仅执行恒定时间 API 调用的“纯 Lua”代码,因为 API 调用只是 Lua 的一行代码/指令; Lua 没有“进入”该函数的 View 。
要解决这个问题,您需要实际的多线程,例如使用lualanes 、多处理(例如使用 luaposix's fork )或非阻塞 API 和轮询。
关于lua - 监督 Lua 中的协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75397099/