sidekiq ワーカー内で em-synchrony と em-http-request (Ruby 2.1) を使用して、多数のリンクを同時にスクレイピングしています。スクレーパーで同時に複数のワーカーを実行しようとする場合を除いて、すべてがうまく機能します。これは私が使用しているコードです:
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'