我怎样才能停止光纤?
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。
假设我们有一个带有长 运行 循环的 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。