Perlbrew устанавливает Perl по умолчанию без поддержки потоков. Это просто устаревшая привычка или установка Perl с поддержкой потоков может вызвать проблемы?

8
Matteo 15 Май 2014 в 10:06

5 ответов

Лучший ответ

Компиляция Perl с поддержкой потоков добавляет много накладных расходов из-за всех блокировок, даже если вы не используете потоки в своей программе. Я измерил накладные расходы около 15% для простого теста, просто используя Perl, скомпилированный с поддержкой потоков.

15
Steffen Ullrich 15 Май 2014 в 06:57

Потому что он недостаточно надежный и производительный, чтобы использоваться по умолчанию.

Кроме того, вы должны учитывать CPAN. Слишком много модулей написано на C без учета потоков.

Я говорю это со всей должной любовью и уважением как бывший разработчик Perl6 / Parrot. Perl5 не разрабатывался с нуля с учетом многопоточности (по крайней мере, когда я был вовлечен в сообщество).

На данный момент я не думаю, что достаточное количество людей хочет это изменить. Будущее было за Perl6, и у Parrot очень рано появились темы. Дестабилизировать Perl 5 на этом этапе его жизненного цикла, вероятно, под вопросом.

Не то чтобы Perl уникален в этом, Linux был таким же долгое время (так как там была большая блокировка ядра, с которой приходилось иметь дело). Большинство проектов начинаются с этого, но некоторые идут дальше, чем другие, прежде чем заняться этим.

4
codenheim 15 Май 2014 в 07:51

Из руководства по потокам Perl:

Базовая поддержка потоков

Поддержка потоков - это опция времени компиляции Perl. Это то, что включается или выключается, когда Perl создается на вашем сайте, а не когда ваши программы компилируются. Если ваш Perl не был скомпилирован с включенной поддержкой потоков, то любая попытка использовать потоки потерпит неудачу.

Ваши программы могут использовать модуль Config, чтобы проверить, включены ли потоки.

2
user966588user966588 15 Май 2014 в 08:05

Как сказал @ steffen-ultisch, это проблема производительности.

Но при желании можно легко установить Perl как с потоками, так и без них, так что вы можете использовать версию, более подходящую для данного сценария.

Установка perlbrew, скажем, для Perl 5.22.1, выглядит так:

perlbrew install-multiple 5.22.1 --both=thread
2
Eugen Konkov 26 Мар 2019 в 16:08

Perl threading не является потоком в обычном смысле - он фактически запускает отдельный интерпретатор для каждого потока, поэтому общего состояния нет. Модель с общей памятью является основной причиной использования потоков вместо процессов разветвления, поэтому потоки Perl используются редко.

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

Подробнее см. http://perldoc.perl.org/threads.html.

1
nobody 15 Май 2014 в 06:14