当前位置: 动力学知识库 > 问答 > 编程问答 >

Ruby fiber: resuming transferred fibers

问题描述:

I am trying to understand the behavior of the following code snippet. My specific focus is on the Fiber#transfer method.

require 'fiber'

fiber2 = nil

fiber1 = Fiber.new do

puts "In Fiber 1" # 3

fiber2.transfer # 4

end

fiber2 = Fiber.new do

puts "In Fiber 2" # 1

fiber1.transfer # 2

puts "In Fiber 2 again" # 5

Fiber.yield # 6

puts "Fiber 2 resumed" # 10

end

fiber3 = Fiber.new do

puts "In Fiber 3" # 8

end

fiber2.resume # 0

fiber3.resume # 7

fiber2.resume # 9

I have numbered the lines of code with the expected serial order of execution on the right. Once fiber3.resume returns and I call fiber2.resume, I expect the execution to continue inside fiber2 at the line marked # 10. Instead, I get the following error:

fiber2.rb:24:in `resume': cannot resume transferred Fiber (FiberError)

from fiber2.rb:24:in `<main>'

That's an error reported from the last line of the listing: fiber2.resume.

网友答案:

You might have found a bug in ruby. When you look at the source code, it is implemented the way you describe it:

https://fossies.org/linux/misc/ruby-2.3.1.tar.gz/ruby-2.3.1/cont.c

Follow the transferred flag, it is set to 1 when you transfer the fiber but it is never reset.

IMO it should be reset when the fiber gain control or when yield is called.

分享给朋友:
您可能感兴趣的文章:
随机阅读: