2010-06-22 15 views
9

निम्नलिखित समवर्ती धागे में चलाने के लिए के रूप में मैं उम्मीद प्रकट नहीं होता है, बल्कि प्रत्येक प्रक्रिया ब्लॉक यह पूरा हो गया है जब तक:पर्ल में समवर्ती धागे कैसे चलाएं?

my @arr = (1,2,3,4); 
foreach (@arr) { 
    threads->new(\&doSomething, $_)->join; 
} 

sub doSomething { 
    my $thread = shift; 
    print "thread $thread\n"; 
    sleep(5); 
} 

दूसरे शब्दों में, यह गैर पिरोया संस्करण के समान क्रियान्वित प्रतीत होता है होगा:

my @arr = (1,2,3,4); 
foreach (@arr) { 
    doSomething($_); 
} 

मैं ActivePerl v5.10.1 mswin32-86-बहु धागा

मैं पर्ल में समवर्ती धागे को चलाने के लिए कैसे चल रहा है?

उत्तर

12

perldoc threads देखें।

समस्या यह है कि join() को थ्रेड पर कॉल करने के लिए प्रतीक्षा करने की प्रतीक्षा है। आप धागे को फेंकना चाहते हैं और उसके बाद जुड़ना चाहते हैं, एक ऑपरेशन के रूप में स्पॉन/शामिल नहीं होना चाहते हैं।

perldoc threads पर एक और नज़र का कहना है:

threads-> सूची()

threads-> सूची (धागे :: सभी)

threads-> सूची (धागे :: चल)

threads-> सूची (धागे :: joinable)

कोई तर्क नहीं (या धागे का उपयोग :: सभी) और एक सूची संदर्भ में, सभी गैर-जुड़े, गैर-पृथक थ्रेड ऑब्जेक्ट्स की एक सूची लौटाती है। एक स्केलर संदर्भ में, इसकी गणना करता है।

एक सच्चे तर्क के साथ

(धागे :: चल उपयोग करते हुए), सभी गैर शामिल हो गए, गैर अलग धागे वस्तुओं कि अभी भी चल रहे की एक सूची देता है।

झूठी बहस (धागे का उपयोग करके :: शामिल करने योग्य) के साथ, चलने वाले सभी गैर-जुड़े, गैर-पृथक धागे की वस्तुओं की एक सूची लौटाती है (यानी, जिसके लिए -> जुड़ें() अवरुद्ध नहीं होंगे)।

आप पाश और सूची धागे के लिए इसका उपयोग कर सकते हैं, जब संभव में शामिल होने, जब तक सभी धागे पूरा कर रहे हैं (और आप शायद एक ऊपरी सीमा जहाँ आप उन्हें मारने और रद्द कर देगा समय तक इंतजार करना चाहता हूँ)

+0

मैं इस की कोशिश की है - बस एक ही बार में उत्पन्न करने वाला है, तो सूत्र के माध्यम से पुनरावृत्ति और शामिल होने, लेकिन जैसे ही पहले शामिल होने के ब्लॉक कहा जाता है, यह। यह लगभग है जैसे कि मुझे प्रत्येक थ्रेड पूरा होने तक उपज करने की आवश्यकता होती है, फिर शामिल हों, लेकिन मुझे पूरा यकीन नहीं है कि – user210757

+4

बिल्कुल कैसे करें। 'जॉइन' एक अवरुद्ध ऑपरेशन है। लेकिन धागे जो पहले से ही पैदा हो चुके हैं, तब भी चलेंगे जब मुख्य प्रक्रिया 'जुड़ने' के लिए वापस आने की प्रतीक्षा कर रही है। इस मामले में, यदि आप सभी धागे को फेंकते हैं और फिर शामिल होते हैं, तो आप उम्मीद करेंगे कि पहले शामिल कॉल में लगभग 5 सेकंड लगेंगे, और अन्य सभी कॉल बहुत कम होने के लिए शामिल होंगे। – mob

+0

उत्तर के रूप में चिह्नित किया गया है। सूची(), is_joinable के साथ संयोजन में मुझे क्या चाहिए - धन्यवाद – user210757

3

join (न केवल पर्ल में) थ्रेड को थ्रेड कॉलिंग के लिए प्रतीक्षा करने का कारण बनता है। तो आपका उदाहरण धागा पैदा करता है, इसे समाप्त करने की प्रतीक्षा करता है, और उसके बाद एक और धागा पैदा करता है, इसलिए आपको इंप्रेशन मिलता है कि कोई थ्रेड नहीं होता है।

my @arr = (1,2,3,4); 
my @threads; 
foreach (@arr) { 
    push @threads, threads->new(\&doSomething, $_); 
} 
foreach (@threads) { 
    $_->join(); 
} 
+0

मैं इसे कैसे पूरा करूं? – user210757

12

आप उन्हें में शामिल होने के बाद, उन्हें नहीं बनाते समय है थ्रेड से उत्पन्न आउटपुट, आप थ्रेड पर -> detach() का उपयोग कर सकते हैं।

मेरा @arr = (1,2,3,4); मेरे @ थ्रेड; foreach (@arr) {
मेरी $ टी = threads-> नई (\ & DoSomething, $ _); $ टी-> अलग करें(); }

धागे पूरा होने के बाद, इसे पुनः दावा किया गया है और आपको इसमें शामिल होने की आवश्यकता नहीं है।

इस मॉडल कार्यकर्ता मक्खियों जो आप आप के लिए वापस रिपोर्ट करने की आवश्यकता नहीं है बनाने के लिए अच्छा है।

1

आप joinकॉल करनी होगी के बाद उत्पन्न करने वाला सभी थ्रेड:

perl -mthreads -le'$_->join for map threads->new(sub{print"Thread $_";sleep(2)}),1..4' 
0
my @arr = (1,2,3,4); 
my @threads; 
foreach (@arr) { 
    push @threads, threads->new(\&doSomething, $_); 
} 
foreach (@threads) { 
    $_->join(); 
} 

उपरोक्त कोड एक छोटे पैमाने पर काम कर रहा है। लेकिन अगर आपके पास धागे या अधिक हैं, तो आपका ओएस स्टॉल करना शुरू हो जाता है।

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