थ्रेडिंग मैं निम्नलिखित पूरा करने के लिए कोशिश कर रहा हूँ:पर्ल कतार और
एक धागा है कि एक बहुत बड़ी फ़ाइल से डेटा पढ़ता कहना के बारे में 10GB और उन्हें कतार में धक्का है। (मैं लिए कतार के लिए इच्छा नहीं है या तो बहुत बड़ी प्राप्त)
buildQueue
धागा एक ही समय में कतार को सूचना भेजे है, वहीं के बारे में 5 कार्यकर्ता धागे को डी-पंक्ति और प्रक्रिया डेटा है।
मैं एक प्रयास किया है, लेकिन मेरे दूसरे धागे मेरी buildQueue
धागा में एक सतत पाश की वजह से नहीं पहुंचा जा सकता है।
मेरा दृष्टिकोण पूरी तरह गलत हो सकता है। किसी भी मदद के लिए धन्यवाद, यह बहुत सराहना की है।
यहाँ buildQueue
के लिए कोड है:
sub buildQueue {
print "Enter a file name: ";
my $dict_path = <STDIN>;
chomp($dict_path);
open DICT_FILE, $dict_path or die("Sorry, could not open file!");
while (1) {
if (<DICT_FILE>) {
if ($queue->pending() < 100) {
my $query = <DICT_FILE>;
chomp($query);
$queue->enqueue($query);
my $count = $queue->pending();
print "Queue Size: $count Query: $query\n";
}
}
}
}
और क्योंकि इस सूत्र प्रक्रिया पूरी नहीं होगी, जैसा कि मैंने उम्मीद है कि जब इस सूत्र कुछ भी नहीं मार डाला जाता है और कुछ के बाद निष्पादित किया जाएगा।
my $builder = new Thread(&buildQueue);
चूंकि बिल्डर थ्रेड लंबे समय तक चल रहा है, इसलिए मुझे कभी भी कार्यकर्ता धागे नहीं मिलते हैं।
#!/usr/bin/perl -w
use strict;
use Thread;
use Thread::Queue;
my $queue = new Thread::Queue();
my @threads;
sub buildQueue {
print "Enter a file name: ";
my $dict_path = <STDIN>;
chomp($dict_path);
open dict_file, $dict_path or die("Sorry, could not open file!");
while (1) {
if (<dict_file>) {
if ($queue->pending() < 100) {
my $query = <dict_file>;
chomp($query);
$queue->enqueue($query);
my $count = $queue->pending();
print "Queue Size: $count Query: $query\n";
}
}
}
}
sub processor {
my $query;
while (1) {
if ($query = $queue->dequeue) {
print "$query\n";
}
}
}
my $builder = new Thread(&buildQueue);
push @threads, new Thread(&processor) for 1..5;
सवालों की एक जोड़ी: आप उल्लेख है कि अपने कतार निर्माता धागा खत्म नहीं होगा, लेकिन यह कुछ भी करता है? क्या कतार का आकार कभी भी 100 से नीचे डुबकी या 0 से ऊपर जाता है? साथ ही, [मुझे यकीन नहीं है कि आप अपने धागे सही तरीके से बना रहे हैं] (http://perldoc.perl.org/perlthrtut.html)। यह 'मेरा $ builder = threads-> बनाना नहीं है (\ & buildQueue); '? –
कतार निर्माता ठीक बनाता है लेकिन चूंकि कार्यकर्ता धागे बनाए जाने के लिए नहीं पहुंचे थे, इसलिए वे कतार से कुछ भी नहीं हटा सकते हैं, इसलिए कतार 100 पर फंस गई है जबकि लगातार कूप की वजह से निर्माण कतार अभी भी चल रही है। – Sinista
हम्म, मुझे संदर्भ स्थापित करने के लिए और अधिक कोड देखने की आवश्यकता होगी, खासकर जहां आप धागे बनाते हैं। कार्यकर्ता धागे बनाने से पहले आप कतार बिल्डर को 'शामिल' या 'अलग नहीं कर रहे हैं, है ना? –