Threading aşağıdaki gerçekleştirmek çalışıyorum: Perl Kuyruklar ve
- yaklaşık 10 GB demek ve kuyruğuna içine itmek çok büyük bir dosyadan veri okuyan bir iplik var.
buildQueue
iplik yaklaşık 5 işçi iş parçacığı de-kuyruğu ve süreç verileri aynı anda sıraya veri bastırıyor iken (I için kuyrukta istemiyorsanız ya çok büyük olsun) .
Ben girişimi yaptık ama benim diğer konu çünkü benim buildQueue
iplik sürekli döngünün erişilemez.
Yaklaşımım tamamen yanlış olabilir. Herhangi bir yardım için teşekkürler, çok takdir ediyor.
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";
}
}
}
}
Ve beklediğimden olarak bu iplik bir şey işletilirse bu parçacığı bitirmek olmaz çünkü başka sonra infaz edilecek:
İşte buildQueue
için kod.
Oluşturucu iş parçacığı uzun bir süredir çalışacağından, hiçbir zaman çalışan iş parçacığı oluşturmayacağım. Size ipler (ya join
or detach
yoluyla) çıkmak istediğinizde işaretlemek gerekir
#!/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;
soruların bir çift: Eğer kuyruk-oluşturucu iplik bitirmek olmaz söz, ama hiç bir şey yapar? Sıra boyutu 100'ün altına düşüyor mu veya 0'ın üstüne mi çıkıyor? Ayrıca, [Konularınızı doğru bir şekilde oluşturduğunuzdan emin değilim] (http://perldoc.perl.org/perlthrtut.html). Olmaması gereken $ builder = thread-> create (\ & buildQueue); '? –
Kuyruk oluşturucu iyi oluşturulur, ancak çalışan iş parçacıklarının oluşturulmasına erişilemediğinden, sıradan hiçbir şey kaldırılamaz, böylece sıra sürekli bir döngüden dolayı sıraya girerken sıra 100'de kalır. – Sinista
Hmmm, Özellikle konuları oluşturduğunuzda, içerik oluşturmak için daha fazla kod görmem gerek. İşçi iş parçacığı oluşturmadan önce, sıra oluşturucu veya kuyruk oluşturucuyu ayırmıyorsunuz değil mi? –