私はプロセス間通信に手を出しています。目的は、いくつかの計算を実行し、結果を制御プロセスに返すワーカー プロセスを用意することです。zeromq.nodeをインストールし、coffeescript で簡単なリクエスターとレスポンダーをセットアップしました。
依頼者:
# requester.coffee
zmq = require 'zmq'
context = new zmq.Context()
socket = zmq.socket 'req'
socket.bind 'tcp://127.0.0.1:5555', ( error ) =>
throw error if error?
console.log 'Requesting writer bound to port 5555'
setInterval ( -> socket.send 'helo world' ), 1
response_count = 0
t0 = new Date() / 1000
socket.on 'message', ( message ) ->
response_count += 1
# x = message.toString 'utf-8'
if response_count % 1000 is 0
t1 = new Date() / 1000
console.log "received #{ parseInt response_count / ( t1 - t0 ) + 0.5 } messages per second"
response_count = 0
t0 = new Date() / 1000
応答者:
# responder.coffee
zmq = require 'zmq'
context = new zmq.Context()
socket = zmq.socket 'rep'
socket.connect 'tcp://127.0.0.1:5555'
console.log 'Responder bound to port 5555'
process.stdin.resume()
request_count = 0
t0 = new Date() / 1000
socket.on 'message', ( message ) ->
request_count += 1
# message = message.toString 'utf-8'
# console.log message
socket.send 'helo back'
if request_count % 1000 is 0
t1 = new Date() / 1000
console.log "received #{ parseInt request_count / ( t1 - t0 ) + 0.5 } messages per second"
request_count = 0
t0 = new Date() / 1000
ubuntu (11.10、8GB、Intel Duo Core 3GHz、NodeJS 0.8.6) マシンの別のターミナル ウィンドウでそれらを実行すると、次の出力が得られます。
received 135 messages per second
received 6369 messages per second
received 6849 messages per second
received 6944 messages per second
received 7042 messages per second
received 7143 messages per second
received 5952 messages per second
received 2967 messages per second
received 914 messages per second
received 912 messages per second
received 928 messages per second
received 919 messages per second
received 947 messages per second
received 906 messages per second
received 918 messages per second
received 929 messages per second
received 916 messages per second
received 917 messages per second
received 916 messages per second
received 928 messages per second
(1) 数秒後に伝送チャネルに何らかの飽和があるように見えます。(2) 速度が足りないと感じる。このベンチマークによると、1 秒あたりのメッセージ数は数千ではなく数十万になるはずです。これは、このディスカッション(「ZeroMQ: 10,000 メッセージを受信するのに約 15 ミリ秒かかる」) によって裏付けられています。
また、Python 3 で記述されたレスポンダーを使用しようとしましたが、まったく同じ数値が得られました。さらに、マスター プロセスが子プロセスを生成し、stdout/stdin を介して子プロセスと通信する別のスクリプト ペアを作成しました。1 秒あたり約 750 のメッセージを取得しました (メッセージの長さを増やしてもあまり変化は見られませんでした)。これは、zeromq の実験とほぼ同じです。
これらの数字は予想されるものですか?ここでの制限要因は何ですか?