Ruby 1.9.2 で次のコード スニペットを実行しています。
require "eventmachine"
require "fiber"
EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
EM.add_timer(2) do
print "B"
current_fiber.resume("D")
end
Fiber.yield
end
print "A"
val = fiber.resume
print "C"
print val
EM.stop
end
出力が「ABCD」になり、プログラムが「A」の後に 2 秒間一時停止することを期待しています。ただし、代わりに「AC」をすぐに出力し、終了する前に 2 秒間待機します。私は何を間違っていますか?
(参考までに、em-synchrony を使用せずに、この記事で説明されている em-synchrony スタイルの動作を再現しようとしています。)
編集: ここで、私が最終的に達成しようとしていることについての詳細をいくつか示します。Thin で動作する Grape API を開発しています。各ルート ハンドラは、応答を返す前に、データストア、ZooKeeper、その他の HTTP サービスなどに対してさまざまな呼び出しを連続して行う必要があります。
em-synchrony は非常に優れていますが、ルート ファイバーからの降伏や、上記の場合の非同期の症状を示す結果に関する問題に直面し続けています。rack-fiber_pool も潜在的に役立つように思えますが、すぐに使用できるようにすると、すべての Rack::Test 単体テストが壊れてしまうため、これを使用することにコミットするのは気が進まないのです。
ファイバーと EventMachine を一緒に使用する方法について根本的な誤解があり、より複雑なフレームワークを効果的に使用できないように思われるため、問題を上記の単純な例にまとめました。