2010-02-19 4 views
8

मैं इस Parallel::ForkManager मॉड्यूल के लिए पर्ल में बहुत नया हूं और इसमें बहुत सारे क्रेडिट हैं, इसलिए मुझे लगता है कि यह मेरी सहायता करता है और मुझे अभी तक पता नहीं चला है।समांतर :: फोर्कमेनगर() मॉड्यूल वैश्विक चर पर सिंक्रनाइज़ेशन का समर्थन करता है?

प्रत्येक बच्चे की प्रक्रिया में गणना की गई महत्वपूर्ण मूल्य के अनुसार, प्रत्येक बच्चे की प्रक्रिया में मुझे क्या करना है, यह वैश्विक हैश मानचित्र में कुछ अपडेट लिखता है। हालांकि, जब मैं लूप के बाहर एक हैश मानचित्र का दावा करता हूं और उम्मीद करता हूं कि लूप के बाद हैश नक्शा अपडेट किया गया है, तो यह पता चला है कि हैश नक्शा खाली रहता है। इसका मतलब है कि हालांकि लूप के अंदर अद्यतन सफल होता है (मान मुद्रित करके), लूप के बाहर यह नहीं है।

क्या कोई जानता है कि कोड का ऐसा टुकड़ा कैसे लिखना है जो मैं चाहता हूं?

उत्तर

6

यह वास्तव में एक पर्ल-विशिष्ट समस्या नहीं है, लेकिन यूनिक्स-शैली प्रक्रियाओं को समझने की बात है। जब आप fork एक नई प्रक्रिया करते हैं, तो प्रक्रियाओं के बीच डिफ़ॉल्ट रूप से कोई भी स्मृति साझा नहीं की जाती है। आपको जो चाहिए वह प्राप्त करने के कुछ तरीके हैं जो आप चाहते हैं।

एक आसान तरीका डिस्क पर फ़ाइल में हैश बांधने के लिए BerkeleyDB जैसे कुछ का उपयोग करना होगा। बंधे हैंश को आपके फोर्क से पहले शुरू किया जा सकता है और फिर प्रत्येक बच्चे की प्रक्रिया तक पहुंच होगी। BerkeleyDB फ़ाइलों को एक साथ कई प्रक्रियाओं से उपयोग करने के लिए सुरक्षित होने के लिए डिज़ाइन किया गया है।

इंटर-प्रोसेस संचार के कुछ रूपों का उपयोग करने के लिए एक और अधिक शामिल विधि होगी। ऐसे प्राप्त करने के सभी गोरो विवरणों के लिए, perlipc मैनपेज देखें, जिसमें पर्ल द्वारा समर्थित कई आईपीसी विधियों पर विवरण है।

यदि आपका पर्ल इसका समर्थन करता है तो अंतिम दृष्टिकोण, थ्रेड का उपयोग करना और उनके बीच चर साझा करना है।

4

प्रत्येक fork कॉल एक नई प्रक्रिया उत्पन्न करता है, इसलिए बच्चे की प्रक्रिया में हैश चर के अपडेट माता-पिता में दिखाई नहीं दे रहे हैं (और fork कॉल के बाद माता-पिता में परिवर्तन बच्चे में दिखाई नहीं दे रहे हैं)।

आप threads (और threads::shared भी देखें) एक धागे में लिखे गए परिवर्तन को किसी अन्य थ्रेड में लिखने योग्य बनाने के लिए उपयोग कर सकते हैं।

एक और विकल्प माता-पिता और बाल प्रक्रियाओं के बीच संदेशों को पारित करने के लिए इंटरप्रोसेस संचार का उपयोग करना है। Forks::Super मॉड्यूल (जिसमें से मैं लेखक हूं) इसे सिरदर्द से कम कर सकता है।

या आपके बच्चे की प्रक्रिया फाइलों में कुछ आउटपुट लिख सकती है। जब मूल प्रक्रिया उन्हें वापस लाती है, तो यह उन फ़ाइलों से डेटा लोड कर सकती है और तदनुसार अपने वैश्विक हैश मानचित्र को अपडेट कर सकती है।

+0

सभी को धन्यवाद, अब मैं समझता हूं! मैं फोर्कमेनगर() को इस मुद्दे की देखभाल करने की उम्मीद कर रहा था। :-) मेरे मामले में, आईपीसी अधिक हो सकता है। मुझे फोर्कमेनगर() का उपयोग करने का संक्षिप्त तरीका पसंद है, तो फोर्कमेनगर() का उपयोग कर प्रक्रियाओं के बीच वैश्विक हैश मानचित्र साझा करने का एक आसान तरीका है? – galactica

+3

@ जेन: एक प्रक्रिया से दूसरे डेटा में डेटा प्राप्त करना * आईपीसी है। इसका मतलब यही है। हालांकि, यह मुश्किल नहीं है। – hobbs

+0

@ जेन: हाँ, एक बंधे हैश का उपयोग करें; एक के लिए http://search.cpan.org/perldoc/BerkeleyDB देखें। – ysth

2

मैन समांतर :: फोर्कमेनगर से "बाल प्रक्रियाओं से रिट्रिविंग डेटा संरचना" अनुभाग पढ़ें। कॉलबैक हैं, बच्चे का डेटा भेजा जा सकता है और माता-पिता उन्हें पुनर्प्राप्त कर सकते हैं और डेटा संरचनाओं को पॉप्युलेट कर सकते हैं।

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