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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> our хешь в потоках. 
:(
    Опции темы
sir_nuf_nuf
Дата 12.11.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в библиотеке
Про AnyEvent там же.  Думаю что вам лучше будет про него почитать - он попроще.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Bulat
Дата 12.11.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(nIkTo @  12.11.2009,  13:06 Найти цитируемый пост)
Bulat, можешь на примерах задачь показать, для задачь какого типа стоит использовать fork, а для каких threads ? И по какому критерию надо определять каким "инструментом" работать?
Иначе ваши слова пустой звук не раскрывающий суть вопроса, так как если быть предельно корректным, то я и до вашего комента понимал что fork это 


Многопоточность необходимо использовать при приложениях, например, клиент - сервер, где идет постоянное "общение", в то же время как fork - более "легкий" позволяет разгрузить один процес, создав несколько копий, с рановмерным или неравномерным распределением выполняемых задач.

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

Как и раньше, у меня всегда единое мнение, не важно какой инструмент сколько памяти потребляет, главное уметь его использовать. Можно использовать многопоточность, но так плохо, что у тебя потребление памяти будет гораздо хуже чем при форке..


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
mvsgt
Дата 13.11.2009, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У fork и thread принципиальное отличие в способах общения между собой потоков и процессов, для потоков гораздо проще. Но некоторые модули перла, например DBI, с потоками могут глючить. Если надо обращаться к общей памяти - то надо выбирать потоки, если это приложение, которое может внезапно рухнуть - лучше процессы.
PM MAIL   Вверх
KSURi
Дата 13.11.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sir_nuf_nuf @  12.11.2009,  13:13 Найти цитируемый пост)
Но технология принципиально нестабильная

Я бы отметил, что это относится только к перлу. И еще на *nix подобных ОС они работают, как оказалось, получше, чем на Windows.

Цитата(sir_nuf_nuf @  12.11.2009,  13:13 Найти цитируемый пост)
threads - потребляют меньше памяти.

А я так и не померил все сам. Есть ссылочка на готовые замеры?


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


Опытный
**


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

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



Цитата(KSURi @  13.11.2009,  16:24 Найти цитируемый пост)
Я бы отметил, что это относится только к перлу. И еще на *nix подобных ОС они работают, как оказалось, получше, чем на Windows.

Да, речь только о perl. 
На windows - при запуске ~ 30 потоков я получал креш в 50 % случаев. Печально



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
nIkTo
Дата 13.11.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(KSURi @ 13.11.2009,  16:24)
Цитата(sir_nuf_nuf @  12.11.2009,  13:13 Найти цитируемый пост)
threads - потребляют меньше памяти.

А я так и не померил все сам. Есть ссылочка на готовые замеры?

Очень любопытно было-бы посметреть на такие замеры, у меня как не проведу замеры каждый раз fork меньше памяти потребляет =)
PM   Вверх
DurRandir
Дата 15.11.2009, 16:22 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема перла в том, что в нём нет потоков. Забудьте о threads. Это полноценные процессы, создание которых занимает значительное время, и потребляет памяти больше, чем fork  в *nix cистемах (в windows - одинаково). Нет нормальной разделяемой памяти (threads::shared - это чёрная магия, никакой разделяемой памяти). 

Если ваша задача упирается в cpu - используйте fork. Сначала загрузить все модули и данные в память, а потом форкаться. Память будет дублироваться только для изменённых данных. Если упирается в ожидание ввода/вывода - я бы посоветовал Coro. Или AnyEvent::EV. Или IO::Lambda. Но не POE ;)

Это сообщение отредактировал(а) DurRandir - 15.11.2009, 16:22
PM   Вверх
KSURi
Дата 16.11.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(DurRandir @  15.11.2009,  16:22 Найти цитируемый пост)
Проблема перла в том, что в нём нет потоков. Забудьте о threads. Это полноценные процессы, создание которых занимает значительное время, и потребляет памяти больше, чем fork  в *nix cистемах (в windows - одинаково).

Достаточно посмотреть в исходники, чтобы убедиться, что вы не правы.


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


Опытный
**


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

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



Цитата(KSURi @  16.11.2009,  10:35 Найти цитируемый пост)
Достаточно посмотреть в исходники, чтобы убедиться, что вы не правы.

Товарищ не так уж далек от истины.. В том плане, что в перле на каждый поток создается свой интерпретатор, с полной копией данных. 
А уж потом некоторые данные делаются общими (с помощью shared переменных).
Так что выигрыш в памяти может быть незаметным.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
DurRandir
Дата 16.11.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



OC скопирует нужные (и только нужные, и только при необходимости) страницы данных в новом процессе быстрее и эффективнее, чем копирование вручную всего интерпретатора заранее, пусть даже и внутри одного процесса. Перловые threads потоки в том смысле, что они используют общее адресное пространство (добавляя много весёлого при работе с XS модулями). Но они не потоки в том смысле, который обычно подразумевается - достаточно дешёвый объект, использующий полностью разделяемую память при обращении к данным и имеющий выделенный стек. Перловые потоки - это бекпорт на *nix програмной эмуляции fork на win-системах.

PS: да, ещё один модуль вспомнил - forks.

Это сообщение отредактировал(а) DurRandir - 16.11.2009, 14:48
PM   Вверх
KSURi
Дата 16.11.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sir_nuf_nuf @  16.11.2009,  12:17 Найти цитируемый пост)
Товарищ не так уж далек от истины.. В том плане, что в перле на каждый поток создается свой интерпретатор, с полной копией данных. 

Я в курсе. Читал сорцы наискосок. Тем не менее, в ОС в которых доступна библиотека pthread будут нормальные потоки (если конечно специально не отключить эту возможность при сборке). Да, с интерпретатором внутри. Но потоки.

Немного отсутпая от темы: если вас волнует скорость и обилие системных вызовов, устройство потоков и подобные вещи, то пора переходить на Си.

Добавлено @ 14:58
Цитата(DurRandir @  16.11.2009,  14:47 Найти цитируемый пост)
Перловые потоки - это бекпорт на *nix програмной эмуляции fork на win-системах.

Два раза прочитал, но не уверен, что понял правильно. Да, в windows потоки эмулируются через fork, который тоже в свою очередь эмулируется через что-то. Это имелось в виду?

Это сообщение отредактировал(а) KSURi - 16.11.2009, 14:58


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


Опытный
**


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

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



Потоки в *nix используют код, похожий на тот, что используется в win для эмуляции fork (там он эмулируется как-раз через виндовые потоки).

Цитата
Немного отсутпая от темы: если вас волнует скорость и обилие системных вызовов, устройство потоков и подобные вещи, то пора переходить на Си.

Меня волнует бесцельное разбазаривание ресурсов smile У меня есть форкающийся демон, при соотношение vss/rss 75mb/35mb реальный расход памяти на 1 экземпляр - 10мб. А с потоками было бы под 25-30 (я не уверен, сколько именно займёт клон интерпретатора).
PM   Вверх
KSURi
Дата 16.11.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(DurRandir @  16.11.2009,  15:41 Найти цитируемый пост)
Потоки в *nix используют код, похожий на тот, что используется в win для эмуляции fork (там он эмулируется как-раз через виндовые потоки).

Потоки в *nix используют POSIX threads (ака pthreads) по умолчанию, а в win* - функции предоставляемые ядром ОС (CreateThread) (не уверен на 100%, подсказали). В каком смысле они "похожи"?
Таким образом, по крайней мере на nix* ОС мы имеем полноценные потоки, пусть они и жрут память.

Цитата(DurRandir @  16.11.2009,  14:47 Найти цитируемый пост)
OC скопирует нужные (и только нужные, и только при необходимости) страницы данных в новом процессе быстрее и эффективнее, чем копирование вручную всего интерпретатора заранее, пусть даже и внутри одного процесса.

Откуда информация? Она перекрывает одно из преимуществ потоков - легковесность по сравнению с процессами.


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


Опытный
**


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

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



Цитата
OC скопирует нужные (и только нужные, и только при необходимости) страницы данных

Это стандартный механизм Copy-on-Write. Точно применяется при форке в Linux & Freebsd.

Почему быстрее? Потому что этим сразу занимается ОС. 
Почему эффективнее? Потому что копируется только то, что меняется (название метода). А клонирование интерпретатора - это копирование всей памяти заранее, не зная, надо это или нет. А с форком приложению ни о чём не надо беспокоиться.

Цитата
В каком смысле они "похожи"

Что делаем в win для эмуляции форка? 
1. Нам надо создать копию приложения - создаём новый поток
2. Но все данные (пока) общие, поэтому клонируемся, делая все данные приватными
3. Мы получили поток, но с изолированной памятью - по сути, процесс, что и требовалось

Теперь в nix:
1. Нам надо создать поток - создаём его
2. Клонируемся, делая все данные приватными, не трогая ::shared (или тоже клонируем, но не суть)
3. Получили перловый поток. Но чем он отличается от win-"процесса"?

А теперь по легковесности - я даже тредовый перл собрал на тестовой машинке smile

use <many modules>;
for (1..2000){
  if (fork){
    next;
  }else{
    exit 0;
  }
}
runtime: 11.7451310157776

А теперь

for (1..2000){
  threads->create(sub{
    return 1;
  })->detach();
}

Out of memory! Сам скрипт занимает ~10мб в памяти. Убираем немного модулей...segmentation fault! Добро пожаловать в мир несовместимостей) Оставляю только Time::HiRes.
runtime: 13.0303740501404

А если ждать завершения каждого потока? Меняем detach->join
runtime: 9.81970191001892

Ну и чтобы убедиться, что потоки съедают память на ура - добавляем и для потоков, и для процессов sleep 5.

Created thread #883
Thread creation failed: pthread_create returned 35 at ./threads.pl line 33.

Упираемся в ограничение 512res для процесса.

Для процессов: Mem: 730M Active по сравнению с Mem: 559M Active в обычном состоянии. Дельта - 171мб. На все 2000 процессов.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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