Есть ли способ управлять процессами в Perl (то есть заменять потоки, которые действительно работают)?

У меня есть многопоточное приложение на perl, для которого мне приходится полагаться на несколько не поточно-безопасных модулей, поэтому я использовал процессы fork()ed с сигналами kill() в качестве интерфейса передачи сообщений.

Проблема в том, что обработчики сигналов немного нестабильны (мягко говоря) и часто заканчиваются тем, что процессы завершаются в несоответствующем состоянии.

Есть лучший способ сделать это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
388
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Начиная с Perl 5.8, вы должны смотреть на модуль основных потоков. Взгляните на http://metacpan.org/pod/threads

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

Вы всегда можете установить канал между родителем и потомком для передачи сообщений туда и обратно.

pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
    close $reader;
    ...
}
else {
    close $writer;
    my $msg_from_child = <$reader>;
    ....
}

Не очень удобный способ программирования, но он не должен быть «беспорядочным».

В зависимости от того, что именно должна делать ваша программа, вы можете рассмотреть возможность использования POE, который представляет собой среду Perl для многопоточных приложений с потоками пользовательского пространства. Это сложный, но элегантный и мощный инструмент, который может помочь вам избежать поточно-ориентированных модулей, ограничивая активность одним потоком интерпретатора Perl.

Полезные ресурсы для начала работы:

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

Ответ принят как подходящий

Взгляните на forks.pm, «заменяющую замену для потоков Perl с использованием fork ()», которая делает гораздо более разумное использование памяти (но не используйте ее в Win32). Это позволит вам объявлять «общие» переменные, а затем автоматически передавать изменения, внесенные в такие переменные, между процессами (аналогично тому, как это делает threads.pm).

Другие вопросы по теме