Есть ли способ иметь управляемые процессы в Perl (то есть замена потоков, которая действительно работает)? - PullRequest
3 голосов
/ 26 сентября 2008

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

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

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

Ответы [ 4 ]

7 голосов
/ 26 сентября 2008

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

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

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

6 голосов
/ 26 сентября 2008

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

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

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

4 голосов
/ 26 сентября 2008

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

1 голос
/ 26 сентября 2008

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

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

...