アプリケーションの同時実行に EM-Synchrony を使用しようとしていますが、遅延コードとファイバーの使用で問題が発生しました。
EM.defer または EM::Synchrony.defer 内でデータベースを呼び出すと、アプリケーションがエラーでクラッシュします。can't yield from root fiber
以下は、私が達成しようとしていることの実行可能な例です。最初の印刷は機能して表示されます[:first, 1]
が、2番目の印刷は上記のエラーでクラッシュする場所です。
require 'mysql2'
require 'em-synchrony/activerecord'
ActiveRecord::Base.establish_connection(
:adapter => 'em_mysql2',
:username => 'user',
:password => 'pass',
:host => 'localhost',
:database => 'app_dev',
:pool => 60
)
class User < ActiveRecord::Base; end
EM.synchrony do
p [:first, User.all.count]
EM::Synchrony.defer do
p [:second, User.all.count]
end
end
私が最初に考えたのは、おそらく EM::Synchrony.defer 内の Fiber.current と Fiber.yield は、追加の Fiber.new 呼び出しで問題を解決できるということでした。
EM::Synchrony.defer do
Fiber.new do
p [:second, User.all.count]
end.resume
end
これも実行に失敗しますが、今回はエラーが発生しますfiber called across threads
。