我怎样才能停止光纤?

How can I stop a Fiber?

假设我们有一个带有长 运行 循环的 Fiber 和给定的超时通道,当我们收到消息时我们想要停止 fiber 并重新启动它(或做其他事情)。这是伪代码:

# 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

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

但是,在 #6450 中有一个添加 Fiber#cancel 的提议,它将提供一种软终止纤程的方法,方法是在下次执行上下文时在其执行上下文中引发 CancelledException恢复。 这仍然是一个活跃的讨论,描述您的用例肯定会有帮助的见解。

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