2009-09-26 7 views
7

पर्ल में मल्टीथ्रेडिंग करने के लिए मुझे किन मॉड्यूल देखना चाहिए?पर्ल में मल्टीथ्रेडिंग करने के लिए मुझे किन मॉड्यूल देखना चाहिए?

मैं कुछ कम प्रदर्शन करने के लिए देख रहा हूं; मैं चाहता हूं कि थ्रेड एक साथ कई श्रमिकों को चलाने के लिए है, उनमें से प्रत्येक अलग-अलग समय के लिए सो रहा है।

उत्तर

7

पर्ल के हाल के संस्करणों में थ्रेडिंग समर्थन है। यह देखने के लिए कि क्या यह आपके सिस्टम में उपलब्ध है, perl -V:usethreads चलाएं।

$ perl -V:usethreads 
usethreads='define' 

perldoc threads उनका उपयोग करने के लिए एक बहुत अच्छा परिचय देता है।

+2

कभी भी किसी भी चीज़ के लिए ithreads का उपयोग न करें। – jrockway

+0

लिंक काम नहीं कर रहा है –

7

यदि प्रदर्शन एक बड़ा मुद्दा नहीं है, तो fork आईएनजी एकाधिक प्रक्रियाओं शायद धागे से निपटने से कहीं अधिक आसान हो जाएगा। मैं अक्सर Parallel::ForkManager का उपयोग करता हूं जो कि बहुत आसान है, लेकिन यह क्या करता है पर बहुत अच्छा है।

5

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

+3

वर्थ नोटिंग यह है कि पीओई मल्टीथ्रेडिंग या मल्टीप्रोसेसिंग का पूर्ण रूप से समर्थन नहीं करता है, 'पीओई :: व्हील :: रन' आपको फोर्क प्रक्रिया में कोड का एक टुकड़ा चलाने देता है, इसकी आई/ओ और बाहर निकलने की स्थिति का अनुवाद करता है पीओई घटनाओं में। कभी-कभी अवरुद्ध कोड को लपेटने के लिए यह एक बहुत उपयोगी चीज है। – hobbs

+0

मैं दूसरा हूं कि _ – xxxxxxx

2

Coro सहकारी मल्टीटास्किंग के लिए एक अच्छा मॉड्यूल है।

99% समय, यदि आपको पर्ल में धागे चाहिए तो आपको यही चाहिए।

यदि आप एकाधिक कोर उपलब्ध होने पर थ्रेड को अपने कोड को तेज़ करना चाहते हैं, तो आप गलत पथ पर जा रहे हैं। पर्ल अन्य भाषाओं की तुलना में 50x धीमी है। दो सीपीयू पर चलाने के लिए अपने कोड को रिवाइट करने का मतलब है कि अब यह केवल एक सीपीयू पर अन्य भाषाओं की तुलना में 25x धीमी गति से चलता है। धीमी भागों को एक अलग भाषा में पोर्ट करने के प्रयास को बेहतर बनाने के लिए बेहतर है।

लेकिन यदि आप नहीं चाहते हैं कि आईओ अन्य "धागे" को अवरुद्ध करे, तो कोरो बिल्कुल वही है जो आप चाहते हैं।

+1

विकास की गति भी है। –

+0

मैं इस तर्क से थक गया हूं :) पर्ल में जैसे ही हास्केल में जितनी जल्दी हो सके मैं कई चीजें हैंक कर सकता हूं, और हास्केल पेर्ल की तुलना में बहुत तेज़ चलता है। – jrockway

+0

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

9

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

#!/usr/bin/perl 

use threads; 
use Thread::Queue; 
use Modern::Perl; 

my $queue= Thread::Queue->new; 
my $thread_count= 4; 
my $job_count= 10; 
my $start_time= time; 
my $max_job_time= 10; 

# Come up with some jobs and put them in a thread-safe queue. Each job 
# is a string with an id and a number of seconds to sleep. Jobs consist 
# of sleeping for the specified number of seconds. 
my @jobs= map {"$_," . (int(rand $max_job_time) + 1)} (1 .. $job_count); 
$queue->enqueue(@jobs); 

# List the jobs 
say "Jobs IDs: ", join(", ", map {(split /,/, $_)[0]} @jobs); 

# Start the threads 
my @threads= map {threads->create(sub {function($_)})} (1 .. $thread_count); 

# Wait for all the threads to complete their work 
$_->join for (@threads); 

# We're all done 
say "All done! Total time: ", time - $start_time; 

# Here's what each thread does. Each thread starts, then fetches jobs 
# from the job queue until there are no more jobs in the queue. Then, 
# the thread exists. 
sub function { 
    my $thread_id= shift; 
    my ($job, $job_id, $seconds); 
    while($job= $queue->dequeue_nb) { 
    ($job_id, $seconds)= split /,/, $job; 
    say "Thread $thread_id starting on job $job_id ", 
     "(job will take $seconds seconds)."; 
    sleep $seconds; 
    say "Thread $thread_id done with job $job_id."; 
    } 
    say "No more jobs for thread $thread_id; thread exiting."; 
} 
संबंधित मुद्दे

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