Я подумываю об использовании threads
(threads) в модуле, предназначенном для CPAN. Есть ли какие-нибудь ресурсы, на которые я мог бы посмотреть, какие системные Perls сейчас компилируются с useithreads=define
по умолчанию?
Асинхронность занимает центральное место в цели моего модуля. Я смогу реализовать резервный вариант без потоков, но из-за большого количества блокирующих операций ввода-вывода и других долго выполняющихся функций без потоков взаимодействие с пользователем будет хуже. Большую часть этого я могу исправить ценой значительного усложнения кода. Нитки подходят естественно.
Поэтому причина, по которой я спрашиваю, заключается в том, чтобы просто помочь мне сдвинуться с места между «худшим пользовательским опытом» и «более сложным кодом» или просто «извините, это требует поддержки многопоточности».
Также в Windows нет системного Perl. Пользователь обычно устанавливает туда Strawberry Perl, и по умолчанию он поддерживает потоки.
Эти замечания были бы полезны как часть более широкого ответа, включающего дистрибутивы, включающие/не включающие системный Perl. Re:perlbrew: Я использую его постоянно, но это выходит за рамки, так как я конкретно спрашиваю о системных перлах (что предполагает наличие системного перла). По сути, perl -V
из как можно большего количества недавно установленных систем. Если он возвращает «perl: команда не найдена» или что-то в этом роде, это тоже результат. :-)
Я использую Ubuntu 24.04, и его системный Perl скомпилирован с поддержкой потоков: /usr/bin/perl -V | grep useithreads
дает вывод: useithreads=define
. Также Perl установлен по умолчанию в Ubuntu (что подтверждается запуском docker run -it ubuntu:latest /bin/bash
, а затем perl -V
). Таким образом, один из способов определить, скомпилирован ли системный Perl с поддержкой потоков, — это вручную запустить Docker-контейнеры для всех интересующих вас систем, а затем выполнить perl -V | grep useithreads
Проще: perl -V:useithreads
@HåkonHægland Да, именно это я и имел в виду в своем комментарии perl -V
. Создание дюжины или более наиболее распространенных дистрибутивов - это именно то, чего я надеялся избежать (по крайней мере частично), задавая этот вопрос, но если я не получу ответов, у меня есть другие методы... :- ) Вы уже предоставили мне информацию для Win/Mac и Ubuntu 24.04, так что вы можете рассмотреть возможность включения ее хотя бы в ответ. Частичные результаты учитываются.
Я не собираюсь публиковать это в качестве ответа, но я нашел парня по имени Клод, который тусовался перед закрытым магазином Fry's Electronics с табличкой «Подскажу грибы». Я спросил: «Пожалуйста, перечислите текущие версии активно поддерживаемых дистрибутивов Linux с датами их выпуска и URL-адресом для получения их последней версии, показав, поставляются ли они с установленным Perl, и если да, то какая версия Perl и была ли установлена эта версия Perl. имеет потоки включенными (useithreads='define')." Они перечислили семь выпусков Linux, выпущенных не позднее 2022 года, каждый раз давали один и тот же ответ — и все они использовали многопоточный Perl!
Под «системным» Perl мы подразумеваем Perl, который предустановлен в операционной системе или может быть установлен с помощью менеджера пакетов операционной системы. Концепция системного Perl наиболее актуальна для Linux. В macOS Apple объявила устаревшим системный Perl с 2019 года, см. https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes#3318257 и обычно это не так. рекомендуется использовать его для установки дополнительных модулей Perl. В Windows нет системного Perl, но обычно устанавливается Strawberry Perl.
Чтобы проверить, поддерживает ли Perl потоки, мы можем запустить
$ perl -V:useithreads
Если результат равен useithreads='define';
, Perl был скомпилирован с поддержкой потоков. Если вывод равен useithreads='undef';
, он не был скомпилирован с поддержкой потоков.
Поскольку пользователи macOS и Windows не используют системный Perl, мы могли бы вместо этого проверить, поддерживает ли наиболее часто устанавливаемый Perl потоки там. И это так: и homebrew Perl в macOS, и Strawberry Perl в Windows поддерживают потоки.
Теперь возвращаясь к Linux, один из способов проверить, поддерживает ли системный Perl дистрибутива Linux потоки, — это использовать docker. Например, чтобы проверить, поддерживает ли системный Perl в Ubuntu 24.04 потоки, мы можем запустить:
$ docker run --rm ubuntu:latest perl -V:useithreads
useithreads='define';
Я также тестировал на Debian (запускал Docker из Ubuntu 24.04):
$ docker run --rm debian:latest perl -V:useithreads
useithreads='define';
и на CentOS:
$ docker run --rm centos:latest perl -V:useithreads
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "perl": executable file not found in $PATH: unknown.
это означает, что Centos не поставляется с предустановленным Perl. Но если мы установим его с помощью менеджера пакетов:
$ docker run --rm -it centos:latest /bin/bash
# yum install -y perl
# perl -V:useithreads
useithreads='define';
Итак, судя по этим трем тестам, система Perl в Linux в целом может поддерживать потоки, но нам нужно проверить больше систем, чтобы быть уверенными. Дайте мне знать, стоит ли мне протестировать для этого другие дистрибутивы Linux.
Если пользователю нужен ваш модуль, он может легко установить многопоточный Perl с помощью perlbrew (или собрать из исходного кода) в любой системе. Так что я бы не беспокоился о системе Perl. Кроме того, в macOS пользователю обычно не рекомендуется использовать системный Perl для установки модулей, поскольку Apple внесла в него определенные изменения, из-за которых установка дополнительных модулей становится более болезненной.