EMを使うのは初めてなので、ここで本当に助けが必要です
コードは次のとおりです。
EM.run do
queue = EM::Queue.new
EM.start_server('0.0.0.0', '9000', RequestHandler, queue)
puts 'Server started on localhost:9000' # Any interface, actually
process_queue = proc do |url|
request = EM::HttpRequest.new(url, connect_timeout: 1).get # No time to wait, sorry
request.callback do |http| # deferrable
puts http.response_header.status
end
queue.pop(&process_queue)
end
EM.next_tick { queue.pop(&process_queue) }
end
EMに関するいくつかの記事を読みましたが、上記のコードについての私の理解は次のとおりです。
EM::HttpRequest
延期可能です。つまり、原子炉をブロックしません。しかし、で50の同時接続を実行しようとするとab
、同時に提供されるのは最大20にすぎません(ab
レポートによると)。
しかし、process_queue
実行を内部に配置EM.defer
すると(つまり、別のスレッドで実行されますか?)、正常に実行されます。
なんでそうなの?process_queue
延期可能なオブジェクトを初期化し、コールバックを割り当てるだけですが、内部で実行するとどのようEM.defer
に違いが生じますか?