1

RabbitMQ キューのメッセージを取得しています。各メッセージは、リクエストしたい URL です。現在、AMQP gem を使用してキューをサブスクライブし、EventMachine を使用しているため、em-http-request ライブラリを使用して http 要求を作成しています。ここのドキュメントによると: https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests 以下は非同期の http-requests を発行します:

EventMachine.run {
    http1 = EventMachine::HttpRequest.new('http://google.com/').get
    http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get
    http1.callback { }
    http2.callback { } 
end

したがって、RabbitMQ キューをサブスクライブすると、次のコードが得られます。

x = 0
EventMachine.run do
    connection = AMQP.connect(:host => '127.0.0.1')
    channel  = AMQP::Channel.new(connection)
    channel.prefetch(50)
    queue    = channel.queue("http.requests")
    exchange = channel.direct("")

    queue.subscribe do |metadata, payload|
        url = payload.inspect
        eval "
        @http#{x} = EventMachine::HttpRequest.new(url).get
        @http#{x}.callback do
            puts \"got a response\"
            puts @http#{x}.response
        end
        x = x+1
        "
    end
end

これにより、em-http-request ドキュメントで説明されている方法と同様に、新しい変数が動的に作成され、新しい http リクエストが作成されます。しかし、リクエストが実際に非同期で行われているかどうかをテストする方法はありますか? get リクエストが発生するたびにコンソールに書き込み、応答を待たずにそれらが次々と発生するのを確認できるようにすることはできますか?

4

2 に答える 2

1

tcpdump を実行して、出力を分析してみてください。インターリーブされている 2 つの接続の TCP スリーウェイ ハンドシェイクが表示される場合、接続は並行して発生しています。

ただし、それが目的としている場合、これは実際には自動テストの一部ではありません。ライブラリがテスト スイートの一部としてではなく、一度実行すると言っていることを実行することを確認できれば幸いです。

于 2013-02-28T22:15:26.443 に答える
0

あなたが望むものを正確に示す非常に単純な例:

require 'em-http-request'

EM.run do
  # http://catnap.herokuapp.com/3 delays the HTTP response by 3 seconds.
  http1 = EventMachine::HttpRequest.new('http://catnap.herokuapp.com/3').get
  http1.callback { puts 'callback 1' }
  http1
  puts 'fired 1'

  http2 = EventMachine::HttpRequest.new('https://www.google.com/').get
  http2.callback { puts 'callback 2' }
  puts 'fired 2'
end

出力(私にとって):

fired 1
fired 2
callback 2
callback 1

インターネット接続、Heroku および Google によっては、2 番目の HTTP 要求への応答が最初に来る可能性が高く、要求が実際に並行して行われていることを確認できます。

于 2013-02-24T12:48:13.517 に答える