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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при работе с потоками в threads 
:(
    Опции темы
nIkTo
Дата 19.9.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот скрипт, в чём проблема расскажу ниже.

Код

#!/usr/bin/perl -w
use threads;
use threads::shared;

my @array : shared;
my @path : shared;

foreach my $path (@path) {
    # заполняем массив @array
    
    for (0..9) {
    my $thread = threads->create(\&find);
    }
    foreach my $thread (threads->list) {
    $thread->join;
    }
    
    undef @array;
}

sub find {
    while (scalar(@array) > 0) {
    my $var;
    {
        lock @array;
        $var = shift @array || return;
    }
    }
}


Проблеема в том, что для каждого элемента массива @path рождаются новые потоки, тоесть сначала это 1,2,3,4,5 потом это 6,7,8,9,10.
А надо чтобы потоки умирали после отработки и для каждого последующего элемента @path создавались потоки с tid 1,2,3,4,5.

Это сообщение отредактировал(а) nIkTo - 19.9.2009, 15:19
PM   Вверх
nIkTo
Дата 20.9.2009, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проблема всё ещё актуальна. Нужна ваша помощь.
PM   Вверх
nIkTo
Дата 20.9.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Гуру, ответьте.
PM   Вверх
Pfailed
Дата 20.9.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А надо чтобы потоки умирали после отработки и для каждого последующего элемента @path создавались потоки с tid 1,2,3,4,5.

Зачем?


--------------------
PM MAIL   Вверх
nIkTo
Дата 20.9.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Потому что созданые потоки копятся, соответственно увеличивается затрата ресурсов процессора и памяти.
PM   Вверх
Pfailed
Дата 20.9.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Т.е. по вашему поток после завершения не освобождает свои ресурсы и висит мертвым грузом? Проводили ли вы какие-либо тесты в этом направлении?


--------------------
PM MAIL   Вверх
nIkTo
Дата 20.9.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Похоже что не освобождает, и при каждом последующем вызове конструкции :

Код

for (0..9) {
    my $thread = threads->create(\&find);
    }
    foreach my $thread (threads->list) {
    $thread->join;
    }
}


ресурсов сжирается ещё больше и больше.

Pfailed к вам вопрос :
Создаём 5 потоков, они отрабатывают потом на следующей итерации создаём снова пять потоков почему tid начинаются не с 1 а с 6 ? Я так понимаю что старые потоки в тои или иной степени ещё живы и используют определённые ресурсы процессора и памяти.



Это сообщение отредактировал(а) nIkTo - 20.9.2009, 15:33
PM   Вверх
Pfailed
Дата 20.9.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

почему tid начинаются не снова с 1 а с 6 ? 


Потому что нужно ознакомиться с документацией.
Цитата

Thread IDs are unique integers with the main thread in a program being 0, and incrementing by 1 for every thread created.  


Иначе говоря tid это как pid в системе, если процесс с некоторым pid завершится это не значит что следующий процесс будет использовать тот же pid.

Цитата

Похоже что не освобождает


Я набросал тестик
Код

use File::Util;
use threads;

for(1..100)
{
    for(1..3)
    {
        threads->create(\&test);
    }
    
    foreach $thread(threads->list)
    {
        print "join\n";
        $thread->join;
    }
}

sub test
{
    my $img = File::Util->new->load_file('/tmp/nightfountain.jpg', '--no-lock');
    sleep 10;
}


Где /tmp/nightfountain.jpg - это картинка в 5 мб. Запускаю и смотрю за расходованием памяти для этого процесса. Если бы ресурсы не освобождались по окончании потока память используемая процессом непрерывно бы увеличивалась. Но дойдя до определенного предела кол-во используемой памяти перестало изменяться, что свидетельствует о том что память таки высвобождается.



--------------------
PM MAIL   Вверх
nIkTo
Дата 20.9.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Незнаю, но как то 250 МБ сжираемой памяти для 5 потоков, в каждом из которых поизводится скачивание поочерёдно с 50 доменов 1 html страницы объёмом примерно 4кб, как что через чур много уходит памяти. В то время когда всё реализовано без тредов используется 9МБ памяти.
PM   Вверх
KSURi
Дата 20.9.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Thread::Queue?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
nIkTo
Дата 20.9.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



KSURi, а конкретней ?
 smile 
PM   Вверх
shamber
Дата 20.9.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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

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


 




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


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

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