Я пытаюсь выполнить следующее:
Пусть поток, который читает данные из очень большого файла, скажет о 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;