私は2つのFibersを使って基本的な歩留まり/再開パターンを検証しようとしています。しかし、yield/resumeメカニズムは機能していないようです。私はいくつかのバリエーションを試しましたが、間違いを見つけることはできません。ファイバーとの単純な並列性?
イベントの期待されるシーケンス:スレッドオフ
- キック(時間0)
- 最初に戻るまで待機(時間+ 2秒)第二戻るまで
- 待機(時間+ 2秒)
- 済(時間> + 3秒)
は#1
をお試しください#!/usr/bin/env ruby
require 'fiber'
f1 = Fiber.new do
puts "Fiber1 starting @ #{Time.new}."
fib1 = Fiber.current
Fiber.yield
sleep 2
puts "Fiber1 done @ #{Time.new}."
fib1.resume(1)
end
f2 = Fiber.new do
puts "Fiber2 starting @ #{Time.new}."
fib2 = Fiber.current
Fiber.yield
sleep 2
puts "Fiber2 done @ #{Time.new}."
fib2.resume(2)
end
puts "Waiting @ #{Time.new}."
r1 = f1.resume
puts "f1 back @ #{Time.new} - #{r1}."
r2 = f2.resume
puts "f2 back @ #{Time.new} - #{r2}."
sleep 1
puts "Done @ #{Time.now}."
これがもたらす:FiberErrorでresume
結果第二の追加
Waiting @ 2016-06-01 06:15:52 -0700.
Fiber1 starting @ 2016-06-01 06:15:52 -0700.
f1 back @ 2016-06-01 06:15:52 -0700 - .
Fiber2 starting @ 2016-06-01 06:15:52 -0700.
f2 back @ 2016-06-01 06:15:52 -0700 - .
Done @ 2016-06-01 06:15:53 -0700.
。
これは、その結果#2
#!/usr/bin/env ruby
require 'fiber'
f1 = Fiber.new do
puts "Fiber1 starting @ #{Time.new}."
Fiber.yield
sleep 2
puts "Fiber1 done @ #{Time.new}."
1
end
f2 = Fiber.new do
puts "Fiber2 starting @ #{Time.new}."
Fiber.yield
sleep 2
puts "Fiber2 done @ #{Time.new}."
2
end
puts "Waiting @ #{Time.new}."
r1 = f1.resume
puts "f1 back @ #{Time.new} - #{r1}."
r2 = f2.resume
puts "f2 back @ #{Time.new} - #{r2}."
sleep 1
puts "Done @ #{Time.now}."
を試してみてください。どちらの場合も
Waiting @ 2016-06-01 10:53:17 -0700.
Fiber1 starting @ 2016-06-01 10:53:17 -0700.
f1 back @ 2016-06-01 10:53:17 -0700 - .
Fiber2 starting @ 2016-06-01 10:53:17 -0700.
f2 back @ 2016-06-01 10:53:17 -0700 - .
Done @ 2016-06-01 10:53:18 -0700.
、開始/終了時刻が同じであると返されない結果。
あなたの繊維が自分自身でレジュームを呼び出しているのはなぜですか? –
@FrederickCheung - Fiber.current.resumeを使わずに試してみました。それでも、1)スレッドを開始し、2)最初に戻るまで待機し、3)2回目の戻りまで待機し、4)完了したという期待される結果をもたらさない。 – saarp