0

アプリケーションの同時実行に 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

4

0 に答える 0