具有光纤感知数据库调用的EM :: Synchrony.defer导致FiberError异常

时间:2013-12-17 05:13:50

标签: ruby eventmachine fibers em-synchrony

我正在尝试在应用程序中使用EM-Synchrony进行并发,并且遇到了使用延迟代码和Fibers的问题。

在EM.defer或EM :: Synchrony.defer中对数据库的任何调用都会导致应用程序崩溃并显示错误can't yield from root fiber

下面是我正在努力完成的一个非常精简的可运行示例。第一个打印工作并显示[:first, 1],但第二个是上面提到的错误崩溃的地方。

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

0 个答案:

没有答案