2012-02-09 10 views
6

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

यह कोड का नमूना लें:

foreach my $command (@commands) { 
    my $pid = fork(); 
    if (!$defined $pid) { 
    #Fork failed. Do something. 
    } elsif ($pid == 0) { #This is the child. 
     system($command); 
     exit(0) 
    } 
} 

while (wait() != -1) {} #wait() will be -1 when the last child exits. 

तो यह ठीक से काम करेंगे, और प्रत्येक आदेश को संभालने के लिए एक प्रक्रिया बंद अंडे। यह सब समानांतर में होगा जो महान है यदि ये आदेश पूरी तरह से स्वतंत्र हैं।

क्या होगा अगर मेरे पास अचानक 5,000+ आदेश चलने के लिए? विचारहीन रूप से कई प्रक्रियाओं को दूर करना बुद्धिमान नहीं होगा। तो किस प्रकार की जांच लागू की जानी चाहिए, और कैसे?

)

+1

उम का ख्याल रखना होगा, आप कितने काँटेदार चीज़ों को ट्रैक, और एक अधिकतम पर रोक तो आप मशीन को मार नहीं पाते हैं और जल्द ही बहुत गुस्सा होने के लिए sysadmin 3am पर जागृत हो जाते हैं? ;) –

+0

ठीक है, लेकिन उचित "अधिकतम" क्या है? – Jeremy

+2

जहां आपने किया था वहां 'सिस्टम' को कॉल करना मूर्खतापूर्ण है। 'system' मूल रूप से 'कांटा' +' exec' (बच्चा) + 'waitpid' (पैरेंट) है। 'System' को 'exec' में बदलें। – ikegami

उत्तर

7

इसके अलावा, अगर आप एक ही समय में भी कई काँटेदार प्रक्रियाओं को उत्पन्न करने को लेकर चिंतित हैं, तो आप उन्हें थ्रॉटल कर सकते हैं।

या तो अपना खुद का रोल करें ("कांटा" रखने के लिए कतार का उपयोग करके), या बेहतर अभी तक, Parallel::ForkManager मॉड्यूल का उपयोग करें जो आपको एक निर्माता पैरामीटर के माध्यम से एक साथ कांटे को सीमित करने की अनुमति देता है।

use Parallel::ForkManager; 
$pm = new Parallel::ForkManager($MAX_PROCESSES); 

कृपया ध्यान दें कि ForkManager भी एक प्रदान की "इंतजार *" API के माध्यम से आप के लिए समाप्त हो गया बच्चा प्रक्रियाओं उठा

+0

यह जाने के रास्ते की तरह लगता है! धन्यवाद। – Jeremy

3

एक बच्चे बाहर निकल जाता है जब यह माता पिता के लिए एक SIG_CHLD वापस भेजने जा रहा है। आप इन्हें पुनः प्राप्त करना चाहेंगे जैसे कि आप अपनी स्क्रिप्ट के अंत में wait पर अंतिम कॉल तक प्रक्रिया तालिका में ज़ोंबी नहीं होंगे।

Chapter 16 of O'Reilly's Perl Cookbook on Google books इस पर जानकारी का एक समूह प्रदान करता है। असल में, जब आप बच्चों को फेंक रहे हों तो आपको काउंटर में वृद्धि करने की आवश्यकता है, और जब आप उन्हें काट रहे हों तो इसे कम करें, और वर्तमान में चल रहे बच्चों के उचित अधिकतम से पहले नकली न करें।

"उचित अधिकतम" क्या है ... हार्डवेयर पर निर्भर करता है, और उन फोर्क प्रक्रियाएं क्या कर रही हैं। आप जो भी कर रहे हैं और मशीन पर प्रदर्शन प्रभाव को देखने के अलावा उस प्रश्न का कोई स्थिर जवाब नहीं है। अधिमानतः व्यापार के घंटों के दौरान। Sysadmin कहने के बाद आप क्या कर रहे हैं। उसे कुछ सलाह भी हो सकती है।

+0

कॉपीराइट की गई सामग्री के अनधिकृत प्रजनन से लिंक न करें। –

+1

ठीक है, मैं Google पुस्तकें पर एक ही चीज़ से लिंक करूंगा। –

1

सुनिश्चित करें कि आप क्या प्रणाली कुशलतापूर्वक संभाल कर सकते हैं आप की तरह Parallel::ForkManager

0

Spawning (forking) के रूप में कई प्रक्रियाओं मॉड्यूल के रूप में उपयोग कर सकते हैं आपके सिस्टम का समर्थन कर सकते एक fork bomb कहा जाता है की तुलना में अधिक प्रक्रियाओं अंडे न बनाने के लिए। आपका सिस्टम फ्रीज या क्रैश हो सकता है क्योंकि इसकी प्रक्रिया तालिका संतृप्त हो जाती है और मेमोरी और सीपीयू समाप्त हो जाती है। लिनक्स सिस्टम पर, ulimit कमांड को अधिकतम उपयोगकर्ता प्रक्रियाओं को अनुमति दी जानी चाहिए। आप इसे अपने सिस्टम के लिए उचित रूप से सेट कर सकते हैं (चाहिए)। फोर्किंग तेजी से प्रक्रिया बनाता है। इस प्रकार, इस टुकड़ा चार प्रक्रियाओं बनाने है कि अनंत सीपीयू की खपत जब तक मारे गए --- एक बुरा, छोटे बम:

perl -e 'fork; fork; 1 while {}'