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





Начиная с 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).