2016-01-06 8 views
6

मेरे पास एक नोड.जेएस प्रक्रिया है (एक सर्वर नहीं) जो कि एन बाल प्रक्रियाओं को फोर्क करता है। किसी बिंदु पर 50 से अधिक सीपी हो सकते हैं। इसलिए मैंने यह सोचना शुरू कर दिया कि अगर process.send (आईपीसी) वास्तव में अवरुद्ध हो रहा है तो यह प्रत्येक सीपी द्वारा अनुभव किया जा सकता है। क्योंकि मेरे प्रोग्राम में क्या होता है यह है कि प्रत्येक सीपी एक ही पैरेंट प्रक्रिया को संदेश भेजने के लिए process.send का उपयोग करती है ताकि माता-पिता लॉगिंग कर सकें, ताकि लॉगिंग सिंक्रनाइज़ हो जाए। लेकिन अगर प्रक्रिया कुछ समय पर ब्लॉक करती है तो पैरेंट प्रक्रिया एक बाधा बन सकती है।process.send * nix/windows पर सिंक/async है?

तो सवाल यह है - नोड.जेएस आईपीसी ब्लॉकिंग या निक्स और विंडोज़ पर गैर-अवरुद्ध है? यदि यह अवरुद्ध हो रहा है, और यदि मैं या कोई और वास्तव में असीमित आईपीसी चाहता हूं, तो क्या मुझे संदेश कतार या ज़ीरोएमक्यू या कुछ उपयोग करना चाहिए?

उत्तर

8

प्रक्रिया भेजने अतुल्यकालिक करने के लिए सेट किया गया है, 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]" 

देखते हैं कि यह libuv कोड में परिवर्तन के कारण होता है; इसमें कुछ कमियां हैं लेकिन यदि आप माता-पिता की प्रक्रिया को बाधा बनने के बारे में चिंतित हैं तो आप संचार के लिए पाइप का उपयोग कर सकते हैं।

50 सीपी कोई समस्या नहीं होगी, लेकिन आपके वास्तुकला और संदेशों के आकार के आधार पर 500 हो सकता है। उस समय मैं एक संदेश कतार की सिफारिश करता हूं जो थोड़ी अधिक फैंसी है। ज़ीरोएमक्यू या सादा रेडिज़ काम करना चाहिए।

+1

असल में, यदि आप गिथब लिंक पढ़ते हैं, तो यह कहता है कि process.send को सिंक्रोनस नहीं किया गया है, जो सिंक्रोनस नहीं है, जो अच्छी खबर –

+3

"' ChildProcess.prototype.send() 'और' process.send() ' को सिंक्रनाइज़ करने के लिए प्रयुक्त होता था लेकिन libuv/libuv @ 393c1c5 प्रतिबद्ध करने में असीमित बन गया " –

संबंधित मुद्दे