Existe uma maneira de ter processos gerenciados em Perl (ou seja, um tópicos de substituição que realmente funciona)?
-
02-07-2019 - |
Pergunta
Eu tenho um aplicativo multithreded em perl para o qual eu tenho que confiar em vários módulos seguros não-rosca, então eu tenho sido utilizando processos fork()
ed com sinais kill()
como uma passagem de mensagens interface.
O problema é que os manipuladores de sinal são um pouco irregular (para dizer o mínimo) e muitas vezes acabam com processos que são mortos em estados inapropriado.
Existe uma maneira melhor de fazer isso?
Solução
Tenha um olhar em forks.pm , um "substituto para roscas Perl usando fork ()" que faz para uso de memória muito mais sensível (mas não usá-lo em Win32). Ele permitirá que você declarar variáveis ??"compartilhada" e, em seguida, ele passa automaticamente as alterações feitas a essas variáveis ??entre os processos (semelhante à forma como threads.pm faz coisas).
Outras dicas
Dependendo exatamente o que seu programa precisa fazer, você pode considerar o uso POE , que é um framework Perl para aplicações multi-threaded com tópicos do espaço do usuário. É complexo, mas elegante e poderoso e pode ajudar a evitar módulos não-thread-safe, confinando atividade para um único segmento intérprete Perl.
Recursos úteis para começar:
- Programação POE apresentação por Matt Sergeant (comece aqui para entender o que é e faz)
- POE projeto página (muitos exemplos do livro de receitas)
Além disso, existem centenas de componentes POE pré-construídos você pode usar para montar em um aplicativo.
Você sempre pode ter um tubo entre pai e filho para passar mensagens e para trás.
pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
close $reader;
...
}
else {
close $writer;
my $msg_from_child = <$reader>;
....
}
Não é uma maneira muito confortável de programação, mas não deve ser 'errático'.
De perl 5.8 em diante você deve estar a olhar para o módulo tópicos principais. Ter um olhar para http://metacpan.org/pod/threads
Se você quiser usar módulos que não são thread-safe normalmente você pode carregá-los com uma exigem e importação dentro do ponto de entrada na rosca.