Ruby fiber: renewable fiber

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

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 numbered lines of code with the expected order of execution on the right. As soon as it fiber3.resumereturns, and I call fiber2.resume, I expect that execution will continue inside fiber2the line with the inscription # 10 . Instead, I get the following error:

fiber2.rb:24:in `resume': cannot resume transferred Fiber (FiberError)
    from fiber2.rb:24:in `<main>'

This error message from the last line of Listing: fiber2.resume.

+4
source share
2 answers

You may have discovered a ruby ​​error. When you look at the source code, it is implemented as you describe it:

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

, , 1, reset.

IMO reset, .

+2

, Ruby 1.9. 1.9 , , Ruby , #transfer. 2.4, 2. *.

1.9, #transfer . , #resume . Ruby 2.4 #resume , Fiber.yield(), .

( ):

require 'fiber'

fiber2 = nil

fiber1 = Fiber.new do
  puts "In Fiber 1"                 # 3
  Fiber.yield                       # 4 (returns to fiber2)
end

fiber2 = Fiber.new do
  puts "In Fiber 2"                  # 1
  fiber1.resume                      # 2
  puts "In Fiber 2 again"            # 5
  Fiber.yield                        # 6 (returns to main)
  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

#transfer, ( A B) A B, B, , Ruby , A , B . #transfer .

0
source

All Articles