2010-02-09 13 views
9

मैं प्रणाली का एक समूह कर रहा हूँ कॉल कि मैं समानांतर में चलाना चाहते हैं:पर्ल में, मैं सिस्टम कॉल के समूह को समाप्त करने के लिए कैसे रोक सकता हूं?

system(" sleep 5 && echo step 1 done &"); 
system(" sleep 3 && echo step 2 done &"); 
system(" sleep 7 && echo step 3 done &"); 

// block here 

मैं प्रोग्राम प्रवाह कैसे ब्लॉक कर सकते हैं जब तक सभी सिस्टम कॉल समाप्त हो रहे हैं?

+0

क्या माता-पिता perl स्क्रिप्ट को आउटपुट को पार्स करने की आवश्यकता है? आपकी पोस्ट उस आवश्यकता को इंगित नहीं करती है, लेकिन हर बार मुझे ऐसा करना पड़ता था, आउटपुट का प्रबंधन भी एक आवश्यकता थी। पाइप के साथ खुले जादू का प्रयोग करना और उन्हें पढ़ने के लिए चयन करना मेरे लिए अच्छा काम करता है। – ericslaw

उत्तर

9

यह करने के लिए सबसे आसान तरीका है पर में शामिल होने के बारे में fork प्रत्येक सिस्टम कॉल के लिए एक नए बच्चे की प्रक्रिया के लिए शायद है, और फिर उन्हें का इंतजार खत्म करने के लिए। यहां एक सरलीकृत उदाहरण दिया गया है:

my @commands = ("sleep 5 && echo step 1 done", 
       "sleep 3 && echo step 2 done", 
       "sleep 7 && echo step 3 done"); 

my @pids; 
foreach my $cmd(@commands) { 
    my $pid = fork; 
    if ($pid) { 
     # parent process 
     push @pids, $pid; 
     next; 
    } 

    # now we're in the child 
    system($cmd); 
    exit;   # terminate the child 
} 

wait for @pids; # wait for each child to terminate 

print "all done.\n"; 
+0

बिल्कुल सही। मुझे पता है कि मुझे और अधिक पीड़ित होना चाहिए और अपने आप को जवाब संश्लेषित करना चाहिए ... लेकिन मेरा पर्ल बहुत जंगली है। इस स्निपेट के लिए धन्यवाद। –

+6

यह उदाहरण को मिटा देगा इसलिए मैं ज्यादा शिकायत नहीं करना चाहता, लेकिन अगर 'कांटा' विफल रहता है, तो यह 'अपरिफ' लौटाता है जो गलत है, और फिर यह कोड गलत काम करता है। साथ ही, मैं 'system + exit' के बजाय' exec' का उपयोग करने के लिए वोट दूंगा - पर्ल की 'exec' आपको इसे इस तरह के खोल के लिए एक पूर्ण स्ट्रिंग देने की अनुमति देता है। – ephemient

4

प्रत्येक नौकरी करने के लिए एक बच्चे की प्रक्रिया को फोर्क करें, और माता-पिता में, बाहर निकलने से पहले उन प्रक्रियाओं को समाप्त करने की प्रतीक्षा करें।

perldoc perlfork, perldoc -f fork और perldoc -f waitpid देखें।

(इसके लिए सटीक कोड पाठक के लिए एक अभ्यास के रूप में छोड़ा गया है - इसमें शामिल विवरणों को समझने के लिए हर किसी को इसे कम से कम एक बार स्क्रैच से लिखना होगा। इस साइट पर भी कई उदाहरण हैं।)

1

क्या एक अलग धागे से सिस्टम कॉल में से हर एक चल रहा है और धागे

+1

सामान्य रूप से थ्रेड सामान्य रूप से एक अच्छा विचार है, आईएमई। और वे पर्ल में एक विशेष रूप से अजीब विचार हैं, जिनके धागे गधे में एक विशाल दर्द हैं। 'कांटा' समाधान शायद सबसे अच्छा है। – friedo

+0

हमारे प्रोजेक्ट के लिए उपयोग किए जाने वाले पर्ल संस्करण में "थ्रेड" समर्थन नहीं है और मैं बहुत अधिक उपयोग नहीं करता इसलिए मैं अपनी परियोजना को माइग्रेट करने की कोशिश नहीं कर रहा हूं। फिर भी सुझाव के लिए धन्यवाद। –

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