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

StackOverflow https://stackoverflow.com/questions/138696

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Кроме того, существуют сотни готовых Компоненты 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 и импортировать внутри точки входа потока.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top