Concurrency 我怎样才能阻止光纤?

Concurrency 我怎样才能阻止光纤?,concurrency,crystal-lang,Concurrency,Crystal Lang,假设我们有一根光纤,它有一个长时间运行的环路,当我们接收到消息时,我们希望停止光纤并重新启动它(或执行其他操作),它具有给定的超时通道。以下是伪代码: # we have a timeout channel fiber = spawn do # long running task # note that I can't pass anything to the function to stop Something.run end fiber.stop if timeout.rec

假设我们有一根光纤,它有一个长时间运行的环路,当我们接收到消息时,我们希望停止光纤并重新启动它(或执行其他操作),它具有给定的超时通道。以下是伪代码:

# we have a timeout channel
fiber = spawn do 
  # long running task
  # note that I can't pass anything to the function to stop
  Something.run
end

fiber.stop if timeout.receive

目前无法阻止光纤从外部传输

然而,有人建议添加
Fiber#cancel
,这将提供一种方法,通过在下次恢复光纤时在其执行上下文中引发
canceledException
来软终止光纤。 这仍然是一个积极的讨论,描述您的用例肯定会有帮助的见解


另一种选择是通过简单地将光纤从调度程序中移除来硬杀死光纤。然而,这永远不会给它任何清理资源的机会,而且可能不是你想要的。无论如何,目前还没有官方的API。

传统的方法是设置某种“停止”布尔标志:)刚刚更新了这个问题,我没有办法将变量传递给函数以检查每个循环是的,通常我会说“添加要运行的东西以使其可中断”(或者让它在内部关闭某个键…)gl<代码>某物。在这种情况下,run不是我的代码。我认为没有任何帮助-没有办法停止一个本机函数,它不想停止,除非杀死整个过程,无论我们谈论的是不产生的Crystal函数,还是从C编写的库链接的函数。