Есть ли способ управлять процессами в Perl (т. е.замена потоков, которая действительно работает)?
-
02-07-2019 - |
Вопрос
У меня есть многопоточное приложение на perl, для которого мне приходится полагаться на несколько не потокобезопасных модулей, поэтому я использую fork()
процессы редактирования с помощью kill()
сигналы как интерфейс передачи сообщений.
Проблема в том, что обработчики сигналов немного неустойчивы (если не сказать больше) и часто заканчиваются тем, что процессы останавливаются в неподходящих состояниях.
Есть ли лучший способ сделать это?
Решение
Взгляните на forks.pm, "сквозная замена потоков Perl с использованием fork ()", которая обеспечивает гораздо более разумное использование памяти (но не используйте ее в Win32).Это позволит вам объявлять "общие" переменные, а затем автоматически передавать изменения, внесенные в такие переменные, между процессами (аналогично тому, как это делается threads.pm).
Другие советы
В зависимости от того, что именно должна делать ваша программа, вы можете рассмотреть возможность использования ПО, который представляет собой Perl-фреймворк для многопоточных приложений с потоками пользовательского пространства.Это сложный, но элегантный и мощный инструмент, который может помочь вам избежать использования не потокобезопасных модулей, ограничив активность одним потоком интерпретатора Perl.
Полезные ресурсы для начала работы:
- Программирование POE презентация Мэтта Сержанта (начните с этого, чтобы понять, что это такое и для чего она нужна)
- Страница проекта POE (множество примеров из кулинарных книг)
Кроме того, существуют сотни готовых Компоненты POE вы можете использовать для сборки в приложение.
У вас всегда может быть канал между родительским и дочерним для передачи сообщений туда и обратно.
pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
close $reader;
...
}
else {
close $writer;
my $msg_from_child = <$reader>;
....
}
Не очень удобный способ программирования, но он не должен быть "беспорядочным".
Начиная с perl 5.8, вы должны смотреть на модуль core threads.Взгляните на http://metacpan.org/pod/threads
Если вы хотите использовать модули, которые не являются потокобезопасными, вы обычно можете загрузить их с помощью require и импортировать внутри точки входа потока.