1

読み取りストリームを開いてファイルを読み取ろうとしており、ZMQ を介してファイルのチャンクを別のプロセスに送信してそれらを消費しようとしています。ストリームは正常に動作していますが、ワーカーを開始すると、送信されたデータが表示されません。

コールバックではなく、500ミリ秒ごとにソケットを介してデータを送信しようとしましたが、ワーカーを開始すると、以前のデータのチャンクがすべて収集されます。

sender = zmq.socket('push')
setInterval(() ->
  console.log('sending work');
  sender.send('some work')
, 500)

receiver = zmq.socket("pull")
receiver.on "message", (msg) ->
  console.log('work is here: %s', msg.toString())

出力:

sending work
sending work
sending work
sending work
sending work
// here I start the worker
sending work
work is here: some work
work is here: some work
work is here: some work
work is here: some work
work is here: some work
work is here: some work
sending work
work is here: some work
sending work
work is here: some work
sending work
work is here: some work

そのため、ワーカーが開始すると、以前のすべてのデータをプルすることから始まり、sth new が入るたびにプルします。これは、次の場合には当てはまりません。

readStream = fs.createReadStream("./data/pg2701.txt", {'bufferSize': 100 * 1024})
readStream.on "data", (data) ->
  console.log('sending work');
  sender.send('some work'); // I'd send 'data' if it worked..

このシナリオでは、ワーカーはデータをまったくプルしません。これらの種類のソケットは、キューを作成することになっていますか? ここで何が欠けていますか?

4

1 に答える 1

0

はい、プッシュ ソケットは HWM に到達するまでブロックされており、送信先はありません。送信側がまだバインドされていない可能性があります。次のようにしてみてください。

sender.bind('address', function(err) {
  if (err) throw err;
  console.log('sender bound!');

  // the readStream code.
}

コード例にも aconnectがありません。そこにあるに違いありませんが、忘れている可能性があります。

于 2012-11-08T05:17:41.287 に答える