FiberError: "волокно вызывается через потоки" с использованием em-synchrony

Я использую em-synchrony и em-http-request (Ruby 2.1) внутри приложения sidekiq для одновременной очистки нескольких ссылок. Все работает хорошо, за исключением случаев, когда я пытаюсь запустить несколько рабочих одновременно со скребком. Это код, который я использую:

def process(web_pages)
  EM.synchrony do
    EM::Synchrony::Iterator.new(web_pages, concurrency=50).map do |web_page, iter|
      EventMachine::HttpRequest.new(web_page.url, request_options).get(redirects:10)
    end
    EventMachine.stop
  end
end

Когда этот рабочий процесс выполняется одновременно с несколькими экземплярами, он в итоге выдает следующую ошибку:

WARN: FiberError: fiber called across threads
WARN: ruby-2.1.0/gems/em-synchrony-1.0.4/lib/em-synchrony/iterator.rb:28:in `resume'
/ruby-2.1.0/gems/em-synchrony-1.0.4/lib/em-synchrony/iterator.rb:28:in `block in map'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:172:in `call'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:172:in `block in map'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:206:in `call'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:206:in `block in inject'
/ruby-2.1.0/gems/em-synchrony-1.0.4/lib/em-synchrony/iterator.rb:17:in `call'
/ruby-2.1.0/gems/em-synchrony-1.0.4/lib/em-synchrony/iterator.rb:17:in `block in each'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:95:in `call'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:95:in `block in each'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:117:in `call'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:117:in `block (2 levels) in each'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:195:in `call'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:195:in `block (2 levels) in inject'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:161:in `call'
/ruby-2.1.0/gems/eventmachine-1.0.8/lib/em/iterator.rb:161:in `block (2 levels) in map'

0 ответов

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