Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточная обработка нескольких файлов, threads 
:(
    Опции темы
Suppir
Дата 28.6.2016, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Добрый день!

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

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

Код

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 секунд. 

Подскажите, что я сделал не так в многопоточном режиме?
PM MAIL   Вверх
alezzz
Дата 29.6.2016, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Если правильно понял описание threads, то join останавливает основную программу и ждет завершения потока.
Я потоки отсоединяю detach-ем и кидаю в них задания через shared.
PM MAIL   Вверх
Suppir
Дата 29.6.2016, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Вот такой код заработал:

Код

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) нужно было вынести из скобок. Иначе зависало. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1086 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.