2016-01-06 15 views
6

N alt işlemlerini engelleyen bir Node.js işlemim (bir sunucu değil) var. Bir noktada 50'den fazla CP olabilir. Bu yüzden, process.send (IPC) gerçekten engelleniyorsa, bu durumun her CP tarafından büyük bir cezaya dönüşebileceğini düşünmeye başladım. Çünkü benim programımda olan şey, her CP'nin tek ebeveyn işlemine mesaj göndermek için process.send kullanmasıdır, böylece ebeveyn kayıt işlemini yapar, böylece kayıt senkronize edilir. Ancak, eğer process.send bir noktada engellerse, ana süreç bir darboğaz haline gelebilir. process.send senkronizasyon/async on * nix/Windows?

Yani soru edilir - node.js IPC engelliyor ya * nix ve Windows'u olmayan engelleme? Engelleme yapıyorsa ve ben ya da bir başkası gerçekten eşzamanlı olmayan IPC'yi istiyorsa, bir ileti sırası veya ZeroMQ kullanmalı mıyım?

Süreç gönderme asenkron olarak ayarlandı

cevap

8

, bu libuv kod değişiklikleri nedeniyle 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]" 

bakınız; Bir kaç dezavantajı var ama eğer ana süreçte darboğaz haline gelmekten endişe ediyorsanız, bunun yerine iletişim için boruları kullanabilirsiniz.

50 CPler bir sorun olmayacak, ancak 500 mimarisi ve mesajların boyutuna bağlı olarak kısaltabilir. Bu noktada biraz daha süslü bir mesaj sırasını tavsiye ederim. ZeroMQ veya düz redis çalışması gerekir.

+1

aslında, Github bağlantısını okursanız, process.send'in eşzamanlı değil senkronize olduğunu, iyi bir haber olduğunu belirtir –

+3

"ChildProcess.prototype.send()" ve "process.send()" 'u eşzamanlı olarak çalıştırmak için kullanılır, ancak commit libuv/libuv @ 393c1c5'de eşzamansız hale gelir –