Про многопоточность в PHP мы уже говорили (напомню, что она работает только с сокетами). Пришло время поговорить о чём-нибудь более серьёзном. Например, о многопоточности в PERL.
Однако прежде всего разберемся с терминологией, чтобы потом не возникло путаницы, как это случилось в комментариях к вышеупомянутой статье. Под многопоточностью я буду понимать возможность одновременного выполнения различных операций (сисадмины любят употреблять термин thread — нить) в рамках одного процесса. Другая возможность параллельно выполнять задачи — расщепление процесса (когда вместо одного процесса будет запущено два), или fork.
С многопоточностью в моем понимании в PERL дела обстоят куда лучше, чем в PHP: возможность поддержки нитей заложена в ядре языка (хотя по умолчанию многопоточность выключена) начиная с версии 5.6, а в стандартном наборе пакетов имеется объектно-ориентированный модуль, позволяющий легко и просто манипулировать потоками.
В этой статье я расскажу, как проверить, поддерживает ли Perl на вашем сервере работу с нитями и, если не поддерживает, как эту самую поддержку активировать.
Для управления потоками в стандартный состав Perl входит модуль threads.pm. Но если Perl собран без поддержки многопоточности (а по умолчанию это именно так), работать этот не будет. Поэтому самый простой способ проверки, поддерживается многопоточночть или нет — запуск из консоли пустого скрипта с подключением модуля threads:
$ perl -e 'use threads'
$
Если ничего не произошло, то модуль threads отработал как надо, сладовательно, Perl собран с поддержкой нитей. А если в терминале наблюдается что-то вроде такого:
$ perl -e 'use threads'
-e line 1:
This Perl hasn't been configured and built properly for the threads
module to work. (The 'useithreads' configuration option hasn't been used.)
Having threads support requires all of Perl and all of the XS modules in
the Perl installation to be rebuilt, it is not just a question of adding
the threads module. (In other words, threaded and non-threaded Perls
are binary incompatible.)
If you want to the use the threads module, please contact the people
who built your Perl.
Cannot continue, aborting.
BEGIN failed--compilation aborted at /usr/local/lib/perl5/5.8.8/mach/threads.pm line 28.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
то, очевидно, Perl установлен без поддержки многопоточности. Будем исправлять
Обращаю внимание вот на этот фрагмент сообщения:
Having threads support requires all of Perl and all of the XS modules in
the Perl installation to be rebuilt, it is not just a question of adding
the threads module. (In other words, threaded and non-threaded Perls
are binary incompatible.)
Забегая вперед, скажу, что у меня после пересборки Perl перестал работать HTML::Parser, используемый пакетом LWP. Переустановка, разумеется, помогла
.
Perl, как и всё в FreeBSD, мы будем переустанавливать из портов (для порядка сошлюсь на мануал, хотя ты, достопочтимый читатель, наверняка это всё отлично знаешь).
$ su
# cd /usr/ports/lang/perl5.8
# make FORCE_PKG_REGISTER=1 WITH_THREADS=yes reinstall clean
Небольшие пояснения (опять же, чтобы объяснение было полным, я не сомневаюсь, что все умеют работать с портами) о том, что же мы сделали этими командами:
- Первая строка позволяет получить root-права. Разумеется, текущий пользователь должен входить в группу wheel и знать root-пароль
Обратите внимание, что после получения root-привилегий приглашение в консоли изменилось. Чаще всего так и бывает
- Второй строкой мы переходим в каталог порта Perl 5.8.
- Третья строка запускает процесс переустановки perl с ключом usethreads (список всех параметров можно прочитать в Makefile порта). Параметр FORCE_PKG_REGISTER позволит переустановить программу, не удаляя ее из реестра установленных пакетов.
Процесс пересборки довольно быстрый: на Celeron-1.7/512Mb он занял что-то около 5 минут (специально засечь не догадался. Если интересно — man time
).
Когда сборка удачно завершится, ваш Perl станет многопоточным. Однако прежде чем начать программирование, желательно переустановить несколько пакетов. Как я уже говорил, у меня отказался работать HTML::Parser, который активно юзается веб-клиентом LWP. Других проблем пока не обнаружил.
Зная имя пакета, можно найти его порт и переустановить. Вот правила, по которым строится имя перлового модуля в дереве портов FreeBSD (опять же на примере HTML::Parser): названеие начинается на p5-, далее идёт название пакета (c учётом регистра), в котором двойное двоеточие (оно означает ссылку на пространство имён) заменяются дефисом. То есть пакет HTML::Parser в дереве портов FreeBSD называется p5-HTML-Parser.
# cd /usr/ports
# make search name=p5-HTML-Parser
Port: p5-HTML-Parser-3.56
Path: /usr/ports/www/p5-HTML-Parser
Info: Perl5 module for parsing HTML documents
Maint: perl@FreeBSD.org
B-deps: p5-HTML-Tagset-3.10 p5-Test-Harness-2.64 p5-Test-Simple-0.70 p5-URI-1.35 perl-5.8.8
R-deps: p5-HTML-Tagset-3.10 p5-URI-1.35 perl-5.8.8
WWW: http://search.cpan.org/dist/HTML-Parser/
# cd /usr/ports/www/p5-HTML-Parser
# make FORCE_PKG_REGISTER reinstall clean
Делается это всё, разумеется, с правами суперпользователя. Вот теперь можно приступать к программированию
To be continued…
Комментарии (4)
6 Ноябрь 2007 в 22:39
[...] терминологию напоминать не буду, просто сошлюсь на пост месячной давности, в котором упомянул про threads и forks. Впредь предлагаю к [...]
16 Ноябрь 2007 в 19:13
Спасибо, Братан, реально помог. Этот гребаный Парсер !!! Вот в чем было дело =)
16 Ноябрь 2007 в 19:15
Могу скрипт дать, когда допишу. Для рефспама через Вебализер. Тема вроде тухлая, но проверить надо =)
17 Ноябрь 2007 в 20:30
Спасибо за отзывы. Я и не думал, что эти мои графоманские изыски кому-то реально помогут. Если помогло — замечательно
.
Насчёт скрипта — если только в демонстрационных целях, т.к. спам, как всем хорошо известно, зло. Да и тема с рефспамом и впрямь баянистая