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'
我正在使用 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'