नोड चाइल्ड प्रोसेस - स्पॉन और फोर्क के बीच अंतर


141

यह एक मूल प्रश्न की तरह लग सकता है, लेकिन मुझे कोई दस्तावेज नहीं मिला:

एक नोड.जेड प्रक्रिया को फोर्किंग और स्पॉन करने में क्या अंतर है? मैंने पढ़ा है कि फोर्किंग स्पॉइंग का एक विशेष मामला है, लेकिन उनमें से प्रत्येक का उपयोग करने के लिए अलग-अलग उपयोग के मामले / पुनरावृत्ति क्या हैं?

जवाबों:


215

स्पॉन एक कमांड है जिसे सिस्टम कमांड चलाने के लिए डिज़ाइन किया गया है। जब आप स्पॉन चलाते हैं, तो आप इसे एक सिस्टम कमांड भेजते हैं जो अपनी प्रक्रिया पर चलाया जाएगा, लेकिन इस नोड प्रक्रिया के भीतर किसी भी अन्य कोड को निष्पादित नहीं करता है। आप अपने द्वारा प्रायोजित प्रक्रिया के लिए श्रोताओं को जोड़ सकते हैं, अपने कोड को प्रायोजित प्रक्रिया के साथ बातचीत करने की अनुमति देने के लिए, लेकिन कोई नया V8 उदाहरण नहीं बनाया गया है (जब तक कि आपकी कमांड एक और नोड कमांड नहीं है, लेकिन इस मामले में आपको कांटा का उपयोग करना चाहिए!)। आपके नोड मॉड्यूल की केवल एक प्रति प्रोसेसर पर सक्रिय है।

कांटा स्पॉन का एक विशेष उदाहरण है, जो V8 इंजन का एक ताजा उदाहरण चलाता है। मतलब, आप मूल रूप से एक ही कार्य के लिए एक ही नोड कोड, या शायद एक अलग मॉड्यूल पर चल रहे कई श्रमिकों को बना सकते हैं। कार्यकर्ता पूल बनाने के लिए यह सबसे उपयोगी है। जबकि नोड का एसिंक्स इवेंट मॉडल किसी मशीन के एक कोर को काफी कुशलता से उपयोग करने की अनुमति देता है, यह नोड प्रक्रिया को मल्टी कोर मशीनों का उपयोग करने की अनुमति नहीं देता है। इसे पूरा करने का सबसे आसान तरीका एक ही प्रोसेसर पर एक ही कार्यक्रम की कई प्रतियां चलाना है।

अंगूठे का एक अच्छा नियम प्रति कोर एक से दो नोड प्रक्रियाएं हैं, शायद एक अच्छी रैम क्लॉक / सीपीयू क्लॉक अनुपात वाली मशीनों के लिए, या सीपीयू काम पर भारी प्रक्रियाओं के लिए, और सीपीयू काम पर प्रकाश के लिए, डाउन घटना को कम करने के लिए। पाश नई घटनाओं की प्रतीक्षा कर रहा है। हालाँकि, बाद का सुझाव एक माइक्रो-ऑप्टिमाइज़ेशन है, और आपकी स्थिति को सुनिश्चित करने के लिए सावधानीपूर्वक बेंचमार्किंग की आवश्यकता होगी, जो कई प्रक्रियाओं / कोर की आवश्यकता के अनुकूल हो। आप वास्तव में अपने मशीन / परिदृश्य के लिए बहुत से श्रमिकों को पैदा करके प्रदर्शन को कम कर सकते हैं।

अंतत: आप स्पॉन का उपयोग उस तरीके से कर सकते हैं, जो स्पॉन को एक नोड कमांड भेजकर किया था। लेकिन यह मूर्खतापूर्ण होगा, क्योंकि कांटा V8 उदाहरण बनाने की प्रक्रिया को अनुकूलित करने के लिए कुछ चीजें करता है। बस यह स्पष्ट कर रहा है, कि अंतत: स्पॉन में कांटा शामिल है। कांटा इस विशेष के लिए सिर्फ इष्टतम है, और बहुत उपयोगी है, मामले का उपयोग करें।

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback


@ChrisCM, अगर मैं var child = require('child_process').fork('child.js');अपने मुख्य ऐप पर उदाहरण के लिए कहता हूं कि उपयोग करता हूं, तो अब मेरे पास 2 अलग कोर चलेंगे। अगर मैं child.js (प्रक्रिया) में लूप के लिए एक भारी रन करने के लिए थे , तो मैं अनिवार्य रूप से पावर कोर के लिए अधिक कोर का उपयोग करना चाहूंगा। सही है? हालांकि उस सीपीयू का उपयोग मेरे मुख्य ऐप कोर को प्रभावित करेगा?
NiCk न्यूमैन

2
अन्य चीजों को प्रभावित किए बिना सीपीयू पर कुछ भी करना असंभव है। शेड्यूलिंग, साझा कैश उपयोग, बस ट्रैफ़िक, आदि, हालांकि, इसे एक अलग कोर का लाभ उठाना चाहिए, और अपने मुख्य रन लूप को पूरी तरह से अप्रभावित छोड़ देना चाहिए। जैसा कि, एक ही कोर प्रोसेसर पर चलने वाली दो प्रक्रियाओं से होने वाले गंभीर नकारात्मक प्रभावों की आपको उम्मीद नहीं है। इस बिंदु पर, यह ठीक से अनुकूलन करने के लिए ऑपरेटिंग सिस्टम और हार्डवेयर सेटअप पर निर्भर है। अलग-अलग सेट अप से अलग-अलग परिणाम मिल सकते हैं।
क्रिस सीएम

@ChrisCM हाँ, मैं मॉन्स्टर पोजिशनिंग को सिंक्रोनाइज़ करने के लिए एक ग्लोबल मॉन्स्टरलौप का उपयोग करता हूं और इसका उद्देश्य यह है कि यह 5,000 कुंजियों जितना हो सकता है। मैं इसे हर 2 सेकंड में iterate करता हूं और यह ऐसा लगता है कि यह मेरे CPU (मुख्य गेम एक) से सैकड़ों मेमोरी उपयोग को बंद कर रहा है। मैं इसे इस तरह से करना चाहूंगा कि उस लूप को बाहर निकालने के बजाय मैं इसे अपने हिसाब से xx बार चलाऊं ... आपकी जानकारी के लिए Ty ~ अब मुझे नहीं पता कि मुझे Redis या आंतरिक IPC का उपयोग करना चाहिए: पी
नीक न्यूमैन

2
"क्यों" को संबोधित करने के लिए धन्यवाद - मेरे द्वारा पढ़े गए सभी पोस्ट इस स्पष्टीकरण के उस सरल हिस्से को याद करते हैं।
aaaaaa

@ChrisCM आप जवाब में ".. लेकिन आपकी नोड प्रक्रिया के भीतर किसी भी आगे कोड को निष्पादित नहीं करता है .."। क्या इसका मतलब है कि मुख्य धागा इंतजार कर रहा है और कुछ भी प्रसंस्करण नहीं कर रहा है..यदि हाँ तो यहाँ स्पॉन का उपयोग करने का क्या फायदा है ..?
अभि

9

TLDR

Spawn

जब एक स्पॉन बनाया जाता है - यह माता-पिता और बच्चे की प्रक्रिया के बीच एक स्ट्रीमिंग इंटरफ़ेस बनाता है ।

स्ट्रीमिंग इंटरफ़ेस का अर्थ है - बाइनरी प्रारूप में डेटा को बफर करनाONE TIME

Fork

जब एक कांटा बनाया जाता है - यह माता-पिता और बच्चे की प्रक्रिया के बीच एक संचार चैनल बनाता है

संचार चैनल का अर्थ है - संदेश

Difference

अच्छी तरह से नीचे अंतर को छोड़कर, दोनों समान डेटा ट्रांसफर करते हुए दिखते हैं

जब आप बाइनरी / एन्कोडिंग प्रारूप में निरंतर डेटा बफ़र करना चाहते हैं, तो स्पॉन उपयोगी होगा , उदाहरण के लिए - स्थानांतरण 1 जीबी वीडियो फ़ाइल, छवि, लॉग इन फ़ाइलेंONE TIME

जब आप मैसेजिंग ईजी - JSONया XMLडेटा मैसेजिंग करना चाहते हैं तो कांटा उपयोगी होगा

Conslusion

स्पॉन का उपयोग बड़े डेटा / फ़ाइलों / छवियों को स्ट्रीम करने के लिए किया जाना चाहिए। पेरेंट प्रक्रिया के लिए स्पॉन प्रक्रिया से

Json / Xml मैसेजिंग करने के लिए कांटे का उपयोग किया जाना चाहिए।

  • उदाहरण के लिए, 10 कांटे की प्रक्रिया माता-पिता से बनती है।
  • और प्रत्येक प्रक्रिया कुछ ऑपरेशन करती है
  • और ऑपरेशन को पूरा करने की प्रत्येक प्रक्रिया अभिभावक को संदेश भेज देगी ' प्रक्रिया संख्या 4 किया ', ' प्रक्रिया संख्या 8 '

एक बच्चे में माता-पिता से लगातार लॉगिंग डेटा और अंत में एक फ़ाइल के बारे में क्या?
एसकरौर्थ

1
@Esqarrouth, आपको यह पहचानने की आवश्यकता है कि क्या यह निरंतर स्ट्रीम या संदेश होगा। और तुम शब्द "निरंतर loging" मुझे विश्वास है यू बच्चे के लिए लॉग (JSON) को wrting किया जाएगा, हाँ तो उपयोग करते हैं इस्तेमाल किया FORKकिसी और यदि आप डेटा का बहुत बड़ा हिस्सा है होना करने के लिए बफ़र तो का उपयोगSPAWN
विजय

5
  • स्पॉन - child_process.spawn एक दिए गए कमांड के साथ एक नई प्रक्रिया शुरू करता है।
  • कांटा - child_process.fork विधि बच्चे की प्रक्रिया बनाने के लिए स्पॉन () का एक विशेष मामला है।

स्पॉन () विधि

child_process.spawn विधि किसी दिए गए कमांड के साथ एक नई प्रक्रिया शुरू करती है। इसके निम्नलिखित हस्ताक्षर हैं -

child_process.spawn(command[, args][, options])

विकल्पों के बारे में और पढ़ें

स्पॉन () विधि स्ट्रीम्स (stdout और stderr) लौटाती है और इसका उपयोग तब किया जाना चाहिए जब प्रक्रिया डेटा की एक मात्रा लौटाती है। जैसे ही प्रक्रिया निष्पादित होने लगती है स्पॉन () प्रतिक्रिया प्राप्त करना शुरू कर देता है।

कांटा () विधि

child_process.fork विधि नोड प्रक्रियाओं को बनाने के लिए स्पॉन () का एक विशेष मामला है। इसके निम्नलिखित हस्ताक्षर हैं -

 child_process.fork(modulePath[, args][, options])

कांटा विधि एक ऑब्जेक्ट को एक सामान्य चाइल्डप्रोसेस उदाहरण में सभी विधियों के अलावा एक अंतर्निहित संचार चैनल के साथ देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.