Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Многоядерность |
Автор: frenkys 25.3.2008, 02:27 |
Вот интересует такой вопрос: сейчас уже везде почти много-ядерные процессоры. Пишут ли под веб на перле именно с поддержкой много-ядерности, или уж сама технология веба это подразумевает? Или же это должно быть реализовано на уровне компилятора? Например fastcgi - они ж не отточены под многоядерные процессоры. |
Автор: GoDleSS 25.3.2008, 09:05 |
Веб-скрипты нет смысла писать многопоточными/многопроцессовыми, т.к. у любого нормальном динамическом сайте: 1. Много пользователей. И даже если мы говорим о мод_перл или фаст сиджиай - 2. Много скриптов. Ну и на последок, если мы говорим о мод_перл + системой с единным сценарием: 3. Перл взаимодействует с несколькими сервисами/демонами - СуБД, мейл демон и т.д. |
Автор: sir_nuf_nuf 25.3.2008, 13:36 |
Скрипт должен отрабатывать быстро. Поэтому распараллеливание - это бессмыслено, больше времени будет уходить на форки и синхронизацию. Другое дело, что один и тот же скрипт зачастую обрабатывает несколько запросов одновременно. Тогда каждый запрос - в своем потоке и процессе. Например Apache - всегда запущено несколько процессов, Apache2 поддерживает многопоточность, поэтому один скрипт может работать параллельно. потоки и процессы операционка раскидывает по процессорам. вывод: не парься! =) P.S. если только сам не задумал веб-сервер писать |
Автор: frenkys 25.3.2008, 18:11 |
Просто тогда чтобы писать быстрые приложения под веб например Java те же JSP будет быстрее за счет многоядерного процессора, ведь даже уже при соединении с мускулем, а оно там всего идет один раз а не кучу висящих коннектов к бд (фастцги). Неужели придеться смотреть в сторону явы? |
Автор: sir_nuf_nuf 25.3.2008, 19:04 |
Ты не понял: многопоточность и многопроцессорность УЖЕ поддерживаются! На уровне apache + OS. тебе при написании скриптов даже думать об этом не прийдется, твои скрипты и так будут использовать все ядра (если конечно apache + OS нормально настроены) Другое дело, что java действительно несколько быстрее чем perl. Именно платформа - т.е. JVM работает чуток эффективней perl, Но это не повод переходить на java. Как показывает опыт тормоза в 90 % случаях - из-за алгоритмов, а не из-за используемого языка. По поводу соединений с DB.. Да в web серверах написанных на java это сделано немного прозрачнее, но и в perl не все так плохо - есть Apache::DBI и Apache::DBI::Cache, которые делают приблизительно тоже самое. Мне кажется, они не умеют разделять подключения между потоками, что конечно плохо.. число подключений будет равно числу потоков. В j2ee подключений меньше. собираюсь обсудить эту тему на форуме сейчас =) |
Автор: vadiml 25.3.2008, 20:46 |
sir_nuf_nuf, По поводу соединений с DB.. ... Мне кажется, они не умеют разделять подключения между потоками, что конечно плохо.. число подключений будет равно числу потоков подключение к базе -- это очень затратное удовольствие, поэтому всё делается гораздо проще -- при первом выполнении скрипта делается подключение и dbh пишется в shared memory, все остальные копии скриптов считывают этот dbh и работаю через него если есть какой-то запрос, которые выполняется очень часто, то он делается параметризированным, т.е. dbh->prepare("запрос с параметрами;"), благодаря чему база парсит его только 1 раз, а потом только постоянно выпоняет с разными условиями, а в дальнейшем вызывается только execute("$param1, $param2, ..."); ЗЫ для mysql prepare() & Co давно есть, для постгреса написаны недавно, если в Вашем дистрибутиве этого еще нет, советую обновить DBD-Pg, в нем было очень много доработок |
Автор: sir_nuf_nuf 26.3.2008, 00:37 | ||
я в курсе как это прибризительно работает. меня интересуют детали. как то - что такое "shared memory" ? Это POSIX shared memory ? или это просто аресное простанство процесса, которое по умолчанию разделено междк потоками ? или это разделяемая память на уровне perl ? в котором вообще говоря память (perlовая) не разделяется между потоками . или это особенность mod_perl ? |
Автор: ginnie 26.3.2008, 11:50 |
vadiml, есть еще один вопрос: как потоки используя одно соединение с базой будут использовать транзакции? |
Автор: vadiml 26.3.2008, 20:57 |
sir_nuf_nuf, что такое "shared memory" ? Это POSIX shared memory ? это я по привычке с С назвал, вот: "memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load" http://www.danga.com/memcached/ думаю в http://search.cpan.org/~bradfitz/Cache-Memcached-1.24/lib/Cache/Memcached.pm написано достаточно и ссылки есть так же есть есть куча подмодулей, но я их не смотрел -- не понадобились ЗЫ я вообще редко для web'а пишу, ginnie, как потоки используя одно соединение с базой будут использовать транзакции? как все базы -- каждая транзакция живёт сама по себе, если возник конфлик по записи данных -- ждёт освобождения, если возникла взаимная блокировка транзакций -- откат одной из них по таймауту. если, конечно, Вы firebird не используете, в котором уже несколько лет обещают многопоточноть, а воз и ныне там ![]() |
Автор: Ramirez 31.3.2008, 11:28 |
это фича mod_perl и апача. пул коннектов к бд или чего угодно можно реализовать, на базе apache + mod_perl вот тут у меня была похожая задача: http://forum.vingrad.ru/topic-166437.html только мне нужен был пул конектов к телнету, но чтобы общий на всех воркеров апача. советую глянуть доки на модперл и директивы PerlRequire в апаче. Суть в общих чертах том, что у апача всегда есть мастер-процесс, который сам запросы не обрабатывает а только управляет пулом воркеров, так вот свой код можно инициализировать в этом процессе. Но при этом все потомки имеют доступ к этм данным. самый натуральный shared memory получается.... но почему это так работает, мне никто объяснить не смог =) |
Автор: ginnie 31.3.2008, 11:40 |
Уважаемый vadiml, проблема в том, что в одном соединении может осуществляться только одна транзакция, соответственно, потоки не могут использовать одновременно одно соединение, если они явно используют транзакции. |
Автор: KSURi 19.10.2009, 11:08 | ||
Это невозможно, т.к. DBI реализован с помощью XS. См. http://forum.vingrad.ru/forum/topic-267383/kw-perl-memcache-libxml/hl/xs/index.html. |
Автор: frenkys 19.10.2009, 13:24 |
и на чем вы остановились в итоге? |
Автор: sir_nuf_nuf 19.10.2009, 15:02 |
на чем мы остановились с чем ? как использовать соединения с базой? У нас так - каждый скрипт работает в своем процессе (не в потоке). Каждый процесс держит постоянно соединение с базой данных. В случае с потоками - обычно создают пул соединений. Каждый поток при необходимости берет соединение из пула, а когда будет не нужно - возвращает. |
Автор: frenkys 19.10.2009, 17:06 |
угу понял спасибо =) Добавлено позже угу понял спасибо =) |
Автор: Bulat 19.10.2009, 17:10 | ||||
Ну, это еще бабка надвое сказала... )) Решающим фактором является именно умения самого программиста... Хороший программист на перле напишет более лучший и быстрый сайт нежели плохой программист на джаве, даже несмотря на казалось бы некоторые преимущества виртуальной машины джава. ![]()
Вообще, это не проблема, если уметь использовать транзакции умело. В конце концов, проект напичканный транзакциями - это наверно не есть хорошо, но иной раз, в паре-тройке мест, ну просто за счастье... Ну а локи неизбежны, все равно используя транзакции в проекте, ну рано ли поздно все равно напорешься, как мне кажется. ![]() |