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