Если вы хотите узнать, как использовать потоки интерпретатора Perl, там есть хорошая документация в perlthrtut
(руководство по темам) и threads
pragma manpage. Это определенно достаточно хорошо для написания простых сценариев.
Тем не менее, я нашел небольшое руководство в Интернете о том, почему и зачем разумно использовать потоки интерпретатора Perl. На самом деле, о них мало что говорят, и если люди говорят о них, довольно часто препятствовать людям использовать их.
Эти потоки, доступные, когда perl -V:useithreads
равно useithreads='define';
и развязаны use threads
, также называются ithreads и, возможно, более подходящими, так как они сильно отличаются от потоков, предлагаемых операционными системами Linux или Windows, или Java VM в том, что ничто не разделяется по умолчанию, и вместо этого копируется много данных, а не только стек потоков, что значительно увеличивает размер процесса. (Чтобы увидеть эффект, загрузите несколько модулей в тестовый script, затем создайте потоки в цикле, останавливающихся для нажатия клавиш каждый раз, и наблюдайте увеличение памяти в диспетчере задач или top
.)
[...] каждый раз, когда вы запускаете поток, все структуры данных копируются в новый поток. И когда я говорю все, я имею в виду все. Это, например, включает пакеты, глобальные переменные, лексики в области. Все!
- Что вам нужно знать перед программированием Perl ithreads (Perlmonks 2003)
Когда вы изучаете предмет Perl ithreads, вы увидите, что люди не поощряют вас использовать их ( "крайне плохая идея" , "принципиально ошибочная" или "никогда не использовать ithreads для чего-либо" ).
В учебнике по потокам Perl подчеркивается, что "Perl Threads Different" , но он не очень беспокоится, чтобы объяснить, как они отличаются и что это означает для пользователя.
Полезным, но очень кратким объяснением того, что на самом деле существует ithreads, является из Coro
man-страницы под заголовком WINDOWS PROCESS EMULATION. Автор этого модуля (Coro - единственные реальные потоки в perl) также не рекомендует использовать потоки интерпретатора Perl.
Где-то я читал, что компиляция perl с включенными потоками приведет к значительно более медленному интерпретатору.
На странице Perlmonks с 2003 года (Что вам нужно знать перед программированием Perl ithreads), в котором автор спрашивает: "Теперь вы может удивиться, почему Perl ithreads не использовал fork()? Разве это не имело бы больше смысла?" Это, похоже, написано автором прагмы forks
. Не уверен, что информация, указанная на этой странице, сохраняется в 2012 году для новых Perls.
Вот некоторые рекомендации по использованию потоков в Perl, которые я перегонял из своих чтений (возможно, ошибочно):
- Рассмотрите возможность использования неблокирующего ввода-вывода вместо потоков, например
HTTP::Async
илиAnyEvent::Socket
илиCoro::Socket
. - Рассмотрите возможность использования потоков интерпретатора Perl только для Windows, а не для UNIX, поскольку в UNIX вилки более эффективны как для скорости памяти, так и для скорости выполнения.
- Создавать потоки в начале программы, а не когда значительная свобода памяти уже значительна - см. "идеальный способ уменьшить эти затраты" в
perlthrtut
. - Минимизировать связь между потоками потому что она медленная (все ответы на этой странице).
До сих пор мое исследование. Теперь, спасибо за любой свет, который вы можете пролить на эту проблему потоков в Perl. Каковы некоторые разумные варианты использования для ithreads в Perl? В чем причина их использования или не использования?