如何停止光纤?

时间:2018-12-17 21:05:56

标签: 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.receive

1 个答案:

答案 0 :(得分:2)

目前无法阻止光纤从外部进入。

但是,在https://momentjs.com/docs/#/get-set/set/中提出了一个添加Fiber#cancel的提议,该提议将提供一种通过在下次恢复执行时在其执行上下文中引发CancelledException来软终止光纤的方法。 。 这仍然是一个活跃的讨论,描述您的用例肯定会有所帮助。

另一种选择是通过简单地从调度程序中删除光纤来硬杀死光纤。但是,这永远不会给它任何清理其资源的机会,而且可能不是您想要的。仍然没有官方的API。