0

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に違いが生じますか?

4

1 に答える 1

2

やりたいことの1つはqueue.pop(&process_queue)process_queueコールバックを。内に置くことですEM.next_tick。現在、新しい接続を許可する前に、キューに入れられたすべての接続を処理します。を呼び出すと、次のアイテムを処理する前に、reactorにいくつかの作業を任せることができますqueue.popnext_tick

于 2012-12-06T04:42:49.320 に答える