Existe uma maneira de ter processos gerenciados em Perl (ou seja, um tópicos de substituição que realmente funciona)?

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

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?

Foi útil?

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:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top