2016-01-06 6 views
6

N個の子プロセスをフォークするNode.jsプロセス(サーバーではない)があります。 ある時点で、50以上のCPが存在する可能性があります。ですから、私はprocess.send(IPC)が本当にブロックしているなら、これは各CPが経験する大きなペナルティかもしれないと考え始めました。私のプログラムで何が起こるのかは、各CPがprocess.sendを使用して単一の親プロセスにメッセージを送信し、親がログを行い、ログが同期されるようにするためです。しかし、process.sendがある時点でブロックすると、親プロセスがボトルネックになる可能性があります。process.sendは* nix/Windowsのsync/asyncですか?

したがって、* nixとWindowsではNode.js IPCブロックまたは非ブロックですか?それがブロックされている場合、私または他の誰かが実際に非同期 IPCをしたい場合、私はメッセージキューまたはZeroMQまたは何かを使用する必要がありますか?

答えて

8

プロセス送信は非同期に設定されている、これはlibuvコードの変化に起因するhttps://github.com/nodejs/node/commit/56d9584a0ead78874ca9d4de2e55b41c4056e502

"`ChildProcess.prototype.send()` and `process.send()` used to operate 
synchronously but became asynchronous in commit libuv/[email protected]" 

参照。それにはいくつかの欠点がありますが、親プロセスがボトルネックになることが懸念される場合は、通信のためにパイプを使用することができます。

50個のCPは、メッセージのアーキテクチャやサイズによっては問題ありませんが、500個は問題ありません。その時点で、私はもう少し気の利いたメッセージキューをお勧めします。 ZeroMQまたはプレーン・レディスが機能するはずです。

+1

実際には、Githubのリンクを読むと、process.sendが非同期で非同期に設定されていると言われています。これは良いニュースです。 –

+3

"' ChildProcess.prototype.send() 'と' process.send() ' を同期動作させるのに使用されましたが、コミット時に非同期になりましたlibuv/libuv @ 393c1c5 " –