EM::Synchrony.defer с вызовом базы данных с поддержкой волоконно-оптических сетей вызывает исключение FiberError

Я пытаюсь использовать 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

Моей первой мыслью было, возможно, что Fiber.current и Fiber.yield в EM::Synchrony.defer означали, что я могу решить проблему с помощью дополнительного вызова Fiber.new.

EM::Synchrony.defer do
  Fiber.new do
    p [:second, User.all.count]
  end.resume
end

Это не работает, но на этот раз я получаю сообщение об ошибке fiber called across threads,

0 ответов

Другие вопросы по тегам