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


Автор: Suppir 23.3.2014, 19:53
Добрый день!

В директории есть 100 файлов txt. Мне нужно запустить скрипт, который на каждом файле отработает функцию "func".

Эта функция делает (например):

Код

sub func
{
    #имя файла передаем через аргумент
    my $file = shift;
    open(IN, $file);
    while(<IN>){
        if (/текст/){
            print OUT "$file $_";
        }
    }
}


То есть функция открывает файл, который посылаем ей в качестве аргумента. Далее функция что-то ищет в файле. При нахождении текста функция пишет текст в декскриптор OUT, который является общим для всех тредов. На самом деле функция гораздо более сложная, поэтому хочу запускать скрипт в 2-х тредах.

То есть программа должна перебирать файлы txt и поддерживать параллельно работающих 2 треда, которые будут выполнять функцию func. Когда один из тредов освобождается, его нужно "нагрузить" следующим файлом. И так далее. Два треда должны все время работать параллельно без простоев. При этом результат вычислений все треды пишут в один файл через дескриптор OUT.

Подскажите, как это сделать?

Автор: shamber 23.3.2014, 22:14
может быть http://perldoc.perl.org/Thread/Queue.html?

Автор: Suppir 23.3.2014, 22:28
Еще бы мне кто пример кода набросал, хотя бы базово...   smile 

Автор: shamber 23.3.2014, 23:51
Беглое гугление

Код

#! /usr/bin/perl
use threads;
use Thread::Queue;

my $q = Thread::Queue->new();    # Новая очередь заданий
#Набиваем задания в очередь, имена файлов или еще чего
$q->enqueue($_) for @ARGV;

# threads
my $thread_limit = 8; 

my @thr = map {
    threads->create(sub {
        while (defined (my $item = $q->dequeue_nb())) { #выгребли задание, Отрабатываем
            doStuff($item);
        }
    });
} 1..$thread_limit;
 
#подыхаем
$_->join() for @thr;

Автор: Suppir 23.3.2014, 23:58
Спасибо, буду пробовать!

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