ruby 一点也不像 Fiber.kill?

ruby has nothing like a Fiber.kill?

我正在使用 Fibers 来处理不同代码块之间的调度,事实证明这比尝试管理线程要简单得多,因为我的用例相当简单(并且只涉及 运行 一个脚本一次)。不幸的是,我需要偶尔“杀死”光纤的能力,但似乎光纤中没有任何东西类似于 Thread.kill

我的 Fibers 只是 运行 用户提供的模板,因此放入大量“我被杀了吗,如果是这样我需要 return 一直到顶层”。而且 'exit' 在 Fiber 中只是在整个 ruby 解释器上调用 exit。

是否有某种方法可以杀死光纤或完全 'exit' 光纤?

如果失败(也许这是另一个问题,但它说明了我为什么要寻找 Fiber.kill)- 我也在考虑使用线程来基本上实现纤程(带有额外的“kill” ability),但我看不到任何方法来执行 thr.run 或 thr.join 直到线程命中 Thread.stop,然后让我在我的主调度程序,所以线程似乎也无法解决我的情况——缺少一个主线程,它只是启动一个线程并坐下来轮询线程是否完成了它的工作部分,这看起来很混乱,令人不安最好的。

我很难理解 yield/resume 为何无法解决您的问题 - 但是当光纤已经屈服时,您可以使用 raise Fiber#raise[=14 中止它=]


def build_fibre
  Fiber.new do |first|
    puts 'doing work'
    3.times { Fiber.yield false }

    puts 'finished work'
    true
  rescue
    puts 'aborted'
  end
end


fiber1 = build_fibre
fiber1.resume

# Raise an exception at the `yield` call
fiber1.raise

fiber2 = build_fibre
loop do
  puts 'waiting'
  break if fiber2.resume
end

puts 'finished'