Я хвостохранилище файла, читаю каждую строку и подачу его в поток очереди, используя приведенный ниже кодне сможет повторно использовать потоки в Perl
use threads;
use threads::shared;
use Thread::Queue;
use threads 'exit' => 'threads_only';
$thread_limit = 10;
my $q = Thread::Queue->new();
my @thr = map {
threads->create(
sub {
while (defined(my $item = dequeue($q))) {
test($item);
}
});
} 1 .. $thread_limit;
my $file = File::Tail->new("/path/File.txt");
while (defined(my $line = $file->read)) {
my @j;
if ($line !~ /\s/) {
push(@j, $line);
}
else {
my @temp = split(/\s/, $line);
my $size = @temp;
for (my $i = 0 ; $i <= $size ; $i++) {
push(@j, $temp[$i]);
}
}
{
lock($q);
$q->enqueue(@job);
}
}
Проблема:
thread_limit = 10
теперь, как только он достигает «количества активных потоков» = 1, потоки останавливаются, хотя очередь имеет больше рабочих элементов для удаления из очереди. Не могли бы вы помочь? Чтение файла для рабочих элементов будет непрерывным.
$ q-> Ставить (@job); $ q-> enqueue (@j); –
Вы всегда должны *** использовать «строгое» и «использовать предупреждения» в верхней части каждой программы Perl, ans объявить все ваши переменные с 'my' как можно ближе к их первой точке использования. – Borodin
. Весь вашего оператора 'if' (если вы использовали' '' 'вместо'/\ s/', как вам следует) совпадает с' my @j = split '', $ line'. И вы должны передать массив по ссылке «enqueue», поэтому вы должны написать '$ q-> enqueue (\ @ j)' – Borodin