fiber = Fiber.new {
puts 'Hello, Fiber'
Fiber.yield
puts 'Hello (again)'
}
fiber.resume
fiber.resume
fiber.resume
Hello, Fiber Hello (again)
FiberError: dead fiber called <main>:10:in `resume' <main>:10:in `<main>' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `load' /Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `<main>'
fiber = Fiber.new { |first|
puts first
second = Fiber.yield('goodbye')
puts second
'goodbye (again)'
}
puts fiber.resume('hello')
puts fiber.resume('hello (again)')
hello goodbye hello (again) goodbye (again)
fib = Fiber.new {
a, b = 0, 1
loop do
a, b = b, a+b
Fiber.yield(a)
end
}
puts 10.times.map { fib.resume }
puts fib.resume
puts fib.resume
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 89 144
fib.resume
233
Proc
との差異は?Fiber
はmrubyのコンパイル時に並列で処理するのに使っている。並列処理はOSでやって、待ちをFiberでやっている。なお、Cygwinではこのビルドが壊れている。fiber = Fiber.new {
puts 'OMG'
}
Thread.fork {
fiber.resume
}.join
#<Thread:0x00007fa5898e4ff0@<main>:4 run> terminated with exception (report_on_exception is true): <main>:5:in `resume': fiber called across threads (FiberError) from <main>:5:in `block in <main>'
FiberError: fiber called across threads <main>:5:in `resume' <main>:5:in `block in <main>'
fiber = Fiber.new {
Thread.fork {
Fiber.yield
}.join
}
fiber.resume
#<Thread:0x00007fa58a91e330@<main>:1 run> terminated with exception (report_on_exception is true): <main>:2:in `yield': can't yield from root fiber (FiberError) from <main>:2:in `block (2 levels) in <main>'
FiberError: can't yield from root fiber <main>:2:in `yield' <main>:2:in `block (2 levels) in <main>'
次回は、「5-11 Process」から