2008-09-26 4 views
3

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

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

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

ответ

4

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

1

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

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

6

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

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

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

7

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

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

  • Programming POE выступление Мэтта Сержанта (начало здесь, чтобы понять, что это и делает)
  • POE project page (много примеров поваренной)

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