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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Память в многопоточных программах 
:(
    Опции темы
rcdimon
Дата 24.4.2006, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне кажется что потоки, которые закончили свою работу не удаляются из памяти. Или происходит что-то подобное.

У меня есть база данный со списком URL'ов... Мне надо что бы по всем этим урлам прошлась бы моя прога и скачала их содержимое. Для каждого урл создается свой поток. Одновременно в памяти поддерживается 10 потоков. 

Если в винде открыть менеджер задач и смотреть на загрузку процессора и файл подкачки то проц загужен на 100%, а файл подкачки резко растет. И только растет. Новые потоки появляются все медленнее. комп начинает ужасно тормозить. Винда матерится на недостаток виртуальной памяти.. и чем больше URLов в базе тем хуже последствия. Если скачать по отдельности (без многопоточности) 200 файлов по их URL  то это займет не так много времени... а с многопоточностьб занимает около часа на моем компе...

Хочу понять как выбрасывать из памяти потоки, которые уе закончили свою работу


Код

#!/usr/bin/perl -w
 
use strict;    
use Thread;    
use DBI;
use LWP::Simple;
use Encode::Encoder;
use lib qw(Q:\home\localhost\cgi-bin\libs);     
use lib qw(Q:\home\localhost\cgi-bin);     
use Myconfig;

my $starttime = time;

my $max_threads = 10;    
my(@res, @streams, @urls, @rids);    

#        @urls; - Массив адресов
#        @rids; - Каждый адрес имеет номер. Массив номеров адресов

{
my $col_th_start = scalar(@urls) < $max_threads ? scalar @urls : $max_threads;    

for (my $i = 0; $i < $col_th_start; $i++){    
     $streams[$i] = Thread->new(\&scan, shift @urls, shift @rids);    
}    

    while (my $th = shift @streams){    
       $th->join();    
       push( @streams, Thread->new(\&scan, shift @urls, shift @rids) ) if @urls;    
    }    
    
sub scan {    
      print 'HI!';
}    
}

my $temp = time;
$temp -= $starttime;
print "\n\n Work time: $temp Seconds\n Done.........";    




если запустить например когда в массиве штук 200 URL то этопочти смертельно для компа smile( Начинает тормозить так, что когда печатаешь буквы появляются медленее чем печатаешь   

Это сообщение отредактировал(а) rcdimon - 24.4.2006, 07:34
PM MAIL ICQ   Вверх
korob2001
Дата 24.4.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Что-то мне подсказывает, что проблема вот в этом цикле.
Код

while (my $th = shift @streams){    
       $th->join();    
       push( @streams, Thread->new(\&scan, shift @urls, shift @rids) ) if @urls;    
}

Я же тебе ещё в прошлой теме написал, что нужно создать условие, по которому программа проверяла бы, завершил поток выполнение или нет, а так же пояснил почему это нужно делать. У тебя цикл на каждой итерации зависает в ожидании, пока поток соединится. ;))))) Вобщем создавай условие, что-то типа:
Код
if ($th->done()) {
    $th->join();
    push( @streams, Thread->new(\&scan, shift @urls, shift @rids) ) if @urls;
} else {
    push( @streams, $th );
}

А так же, было бы не плохо синхронизировать потоки и давать возможность потоку поспать, хотя бы короткое время.    

Это сообщение отредактировал(а) korob2001 - 24.4.2006, 21:14


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 26.4.2006, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Признаться четсно, суть понял, но как приминить не знаю  smile 

Каждый раз когда в коде встречается $th->done();
Он пишет done unimplemented with ithreads.
И все равно ничего не меняется. Подскажи подробнее, пожалуйста  smile 


Вот это тоже не понимаю smile
 >>А так же, было бы не плохо синхронизировать потоки и давать возможность потоку поспать, хотя бы короткое время.    

Зачем их синронизировать? Они занимаются закачкой файлов. Файлы по размером разные бывают и поэтому и потоки разное время работают. Или что значит синхронизировать?
И зачем им спать? 
PM MAIL ICQ   Вверх
korob2001
Дата 28.4.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

Зачем их синронизировать? Они занимаются закачкой файлов. Файлы по размером разные бывают и поэтому и потоки разное время работают. Или что значит синхронизировать?
И зачем им спать?

Например, когда ты зупускаешь бесконечный цикл, он у тебя может отобрать все ресурсы. Здесь по сути происходит тоже самое, только цикл у тебя не бесконечный, но у тебя их работает 10 одновременно.
Причём потоки не сихронизированы, т.е. они грузят файлы в хаотичном порядке. Было бы не плохо, что бы каждый поток грузил файл определённое время, а затем засыпал на короткий промежуток времени и давал возможность другим потокам отработать своё время.
У меня сейчас верисия Perl не многопоточная стоит, потому я не могу даже потестить. Если у тебя есть книга "Программирование на Perl", то почитай главу "Потоки", там очень кратко, но в то же время очень понятно написано всё, что нужно знать о многопоточном программировании на Perl. Эта книга уже есть в электронном виде, посмотри в разделе "Компьютерная литература"->"Perl". 


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


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

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


 




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


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

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