C'è un modo per avere processi gestiti in Perl (cioè una sostituzione di thread che funziona davvero)?

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

Domanda

Ho un'applicazione multithreded in perl per la quale devo fare affidamento su diversi moduli non thread-safe, quindi ho usato i processi fork () ed con kill () segnala come interfaccia di passaggio messaggi.

Il problema è che i gestori del segnale sono un po 'irregolari (per non dire altro) e spesso finiscono con processi che vengono uccisi in stati inappropriati.

C'è un modo migliore per farlo?

È stato utile?

Soluzione

Dai un'occhiata a forks.pm , una sostituzione "drop-in" per i thread Perl usando fork () " che rende l'utilizzo della memoria molto più sensato (ma non usarlo su Win32). Ti permetterà di dichiarare " condiviso " quindi passa automaticamente le modifiche apportate a tali variabili tra i processi (in modo simile a come threads.pm fa le cose).

Altri suggerimenti

A seconda di cosa esattamente deve fare il tuo programma, potresti prendere in considerazione l'utilizzo di POE , che è un framework Perl per applicazioni multi-thread con thread dello spazio utente. È complesso, ma elegante e potente e può aiutarti a evitare moduli non thread-safe limitando l'attività a un singolo thread di interprete Perl.

Risorse utili per iniziare:

Inoltre ci sono centinaia di componenti POE pre-costruiti è possibile utilizzare per assemblare in un'applicazione.

Puoi sempre avere una pipe tra genitore e figlio per passare i messaggi avanti e indietro.

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

Non è un modo di programmare molto comodo, ma non dovrebbe essere "irregolare".

Da perl 5.8 in poi dovresti guardare il modulo dei thread core. Dai un'occhiata a http://metacpan.org/pod/threads

Se si desidera utilizzare moduli che non sono thread-safe, di solito è possibile caricarli con un requisito e importarli all'interno del punto di ingresso del thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top