2016-01-06 8 views
6

Ich habe einen Node.js-Prozess (kein Server), der N child verarbeitet. Irgendwann könnte es mehr als 50 CPs geben. Also habe ich angefangen zu denken, dass, wenn process.send (IPC) wirklich blockiert, dies eine große Strafe für jeden CP sein könnte. Denn was in meinem Programm passiert, ist, dass jeder CP process.send verwendet, um eine Nachricht an den übergeordneten Prozess zu senden, damit der Parent die Protokollierung durchführt, sodass die Protokollierung synchronisiert wird. Aber wenn process.send blockiert, wird der Elternprozess irgendwann zu einem Engpass.process.send ist sync/async auf * nix/Windows?

Die Frage ist also - ist Node.js IPC blockiert oder nicht blockiert auf * nix und Windows? Wenn es blockiert, und wenn ich oder jemand anderes wirklich wollen asynchrone IPC, sollte ich eine Nachrichtenwarteschlange oder ZeroMQ oder etwas?

Antwort

8

Prozess zuzusenden ist asynchron gesetzt worden ist, siehe 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]" 

dies im libuv Code auf Änderungen zurückzuführen ist; Es hat ein paar Nachteile, aber wenn Sie befürchten, dass der Elternprozess zum Engpass wird, können Sie stattdessen Pipes für die Kommunikation verwenden.

50 CPs sind kein Problem, aber 500, abhängig von Ihrer Architektur und Größe der Nachrichten. An diesem Punkt würde ich eine Nachrichtenwarteschlange empfehlen, die etwas ausgefallener ist. ZeroMQ oder plain redis sollte funktionieren.

+1

eigentlich, wenn Sie den Github-Link lesen, heißt es, dass process.send auf asynchrone, nicht synchrone gesetzt wurde, was gute Nachrichten –

+3

"ChildProcess.prototype.send()" und "process.send()" ist verwendet, um synchron zu betreiben, wurde aber in libuv/libuv @ 393c1c5 asynchron –

Verwandte Themen