Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Многопоточная обработка нескольких файлов


Автор: Suppir 28.6.2016, 21:08
Добрый день!

Есть массив файлов, которые нужно обработать в многопоточном режиме.

Пишу в одном потоке:

Код

open(OU, ">$0.log");
my @files:shared = glob("*.txt");
my $threads = @files;

for my $file (@files){
    print "$file\n";
    process($file);
}

sub process
{
    open(IN, $_[0]);
    while(<IN>){
        //длительные операции
    }
}


Время обработки файлов - 11 секунд.


Пробую то же самое сделать в многопотоке:


Код

open(OU, ">$0.log");
my @files:shared = glob("*.txt");
my $threads = @files;

my @threads;
for (1 .. $threads) {
    push @threads, threads->new(
        sub {
            lock(@files);
            my $file = shift(@files);
            print "$file\n";
            process($file);
        }
    );
}

$_->join for (@threads);

sub process
{
    open(IN, $_[0]);
    while(<IN>){
        //длительные операции
    }
}


Время исполнения то же самое - 11 секунд. 

Подскажите, что я сделал не так в многопоточном режиме?

Автор: alezzz 29.6.2016, 20:28
Если правильно понял описание threads, то join останавливает основную программу и ждет завершения потока.
Я потоки отсоединяю detach-ем и кидаю в них задания через shared.

Автор: Suppir 29.6.2016, 20:37
Вот такой код заработал:

Код

open(OU, ">$0.log");
my @files:shared = glob("*.txt");
my $threads = @files;
my @threads;
for (1 .. $threads) {
    push @threads, threads->new(
        sub {
            my $file;
            {
                lock(@files);
                $file = shift(@files);
            }
            print "$file\n";
            process($file);
        }
    );
}
$_->join for (@threads);
sub process
{
    open(IN, $_[0]);
    while(<IN>){
        //длительные операции
    }
}


Добавлено через 4 минуты и 25 секунд
То есть, lock(@files) нужно было вынести из скобок. Иначе зависало. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)