【问题标题】:How can I stop a Fiber?如何停止光纤?
【发布时间】:2018-12-17 21:05:55
【问题描述】:

假设我们有一个具有长时间运行循环的 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

【问题讨论】:

  • 传统方式是设置某种“停止”布尔标志:)
  • 刚刚更新了问题,我没有办法将变量传递给函数以检查每个循环
  • 是的,通常我会说“添加一些东西来运行以使其可中断”(或者让它在内部关闭一些东西......)gl!
  • Something.run 在这种情况下不是我的代码
  • 我认为没有任何帮助 - 没有办法停止一个不想被停止的本机函数,除非我们在谈论水晶函数t yield,或从用 C 编写的库链接的函数。

标签: concurrency crystal-lang


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多