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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите по тредам, многопоточное выполнение ф-ции на файлах 
:(
    Опции темы
Suppir
Дата 23.3.2014, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день!

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

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

Код

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


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

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

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

Это сообщение отредактировал(а) Suppir - 23.3.2014, 19:55
PM MAIL   Вверх
shamber
Дата 23.3.2014, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



может быть Thread::Queue?

Это сообщение отредактировал(а) shamber - 23.3.2014, 23:48
PM MAIL Jabber   Вверх
Suppir
Дата 23.3.2014, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это сообщение отредактировал(а) Suppir - 23.3.2014, 22:30
PM MAIL   Вверх
shamber
Дата 23.3.2014, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Беглое гугление

Код

#! /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;


Это сообщение отредактировал(а) shamber - 23.3.2014, 23:53
PM MAIL Jabber   Вверх
Suppir
Дата 23.3.2014, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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

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


 




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


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

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