スレ:Perlのキューと、私は次のことを達成しようとしている
は、非常に大きなファイルからのデータを約 10ギガバイトを言うと、キューにそれらを押して読み込みスレッドを持っています。
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)。それは 'my $ builder = threads-> create(\&buildQueue);'? –
キュービルダはうまく構築されますが、ワーカースレッドは作成されていないため、キューから何も削除できないため、連続ループのためにビルドキューが実行されている間にキューが100で停止します。 – Sinista
Hmmm、特にスレッドを作成する場所で、コンテキストを確立するためのコードをもっと見る必要があります。ワーカースレッドを作成する前に、キュービルダを 'join'または' detach'しているわけではありません。 –