C'è un modo per avere processi gestiti in Perl (cioè una sostituzione di thread che funziona davvero)?
-
02-07-2019 - |
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?
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:
- Programmazione POE di Matt Sergeant (inizia qui per capire di cosa si tratta è e fa)
- Pagina del progetto POE (molti esempi di libri di cucina)
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.