Как организовать очередь потоков?

Уже поздно, немного подтупливаю, а еще когда и не знаешь... вообще сложно. Подскажите пожалуйста как организовать очередь потоков на обработку файлов:

#!/usr/bin/perl -w --

use strict;
use warnings;

package main;

use threads;
use threads::shared;

my @files = qw(1111.txt 2222.txt 3333.txt 4444.txt 5555.txt 6666.txt 7777.txt 8888.txt 9999.txt 0000.txt);

sub getfile {
        my $file = pop(@files);
        print threads->tid(), ': ', $file, "\n";
        threads->yield();
}
sub main {
    my @files :shared;
    my @t;
    
    for (0 .. scalar(@files) / 5) {
       push(@t, threads->create( sub { getfile() } ));
    }
    $_->join foreach (@t);
    threads->exit();
}

&main;

1;


Основная задача - это получение массива с именами файлов и обработка его в указанное кол-во потоков(5).
Т.е. при создании потока берется элемент массива с удалением на обработку, потом берется следующий и так пока не достигнет 5-ти потоков.
Потом когда очередной поток завершается - берется еще элемент на обработку.

Т.е. нужно реализовать что-то вроде стека.
  • Вопрос задан
  • 253 просмотра
Пригласить эксперта
Ответы на вопрос 2
@MrCricket
Имхо, самое то: perldoc.perl.org/Thread/Queue.html
Ответ написан
Комментировать
@Rozello
#!/usr/bin/env perl

use strict;
use warnings;

use threads;
use threads::shared;

# Создаём расшареную переменную
my @numbers:shared = (1..100);

# Задаём количество потоков
my $threads = shift || 10;

# Создаём потоки и кладём их обекты в массив
my @threads;
for (1..$threads) {
    push @threads, threads->new(
        sub {
            while (@numbers) {
                # Достаём данные из массива
                # Предварительно заблокировава его для остальных потоков
                my $number;
                {
                    # Блокировка работает только в этом скоупе
                    lock(@numbers);
                    $number = shift(@numbers);
                }
                
                print 'Result: '.($number*10)."\n";
            }
        }
    );
}

# Запускаем потоки привязав их к основному процессу
$_->join for (@threads);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы