2010-02-09 18 views
5

C'è un modo semplice per fare async in Perl? Ho la seguente logica per un app Apache:Come si usa la programmazione asincrona in Perl?

get request 
process request 
write to log 
return 

quello che voglio fare è di avere il "Write to log" parte per essere asincrona, in modo che io possa fare la parte "ritorno" al più presto.

+1

Perché non utilizzare non bloccante chiamate per gestire la scrittura per registrare parte dello script? – daotoad

+0

Cosa intendi con "App Apache"? mod_perl? CGI? PSGI? server perl standalone con Apache come front-end? – dolmen

risposta

7

Sfortunatamente, questo in genere comporta il framework POE, ma esiste anche un'alternativa crescente (che vorrei provare prima) denominata AnyEvent.

Vedere this question for learning materials per ulteriori informazioni sull'apprendimento POE. POE è un framework e tende a consumare l'intera applicazione. Inoltre, non è look come Perl, e sporge. Credo che sia una grande curva di apprendimento per la tua tipica applicazione.

AnyEvent è una semplice continuazione basata su task asincroni, dovresti essere in grado di capirlo abbastanza bene con solo i documenti CPAN.

Per la vostra domanda specifica si usa AnyEvent's AIO o POE's Read Write wheel

+0

grazie, mi chiedevo se mi mancasse qualcosa di ovvio, ma non riuscivo a trovarne. Poiché questo fa parte di un'app Apache, nessuna delle due soluzioni sembra interessante. Grazie al – Timmy

+2

, è possibile utilizzare un semplice socket non bloccante per inviare i dati a un demone di scrittura del log POE. E, come ha detto daotoad, fintanto che stai limitando un processo di scrittura per file, probabilmente puoi semplicemente usare un handle non bloccante –

+2

AnyEvent è anche più veloce e meno invadente di POE. Da un ex utente POE stesso, e ora un utente AnyEvent felice. – dolmen

3

è possibile utilizzare i thread in Perl. crea un thread che gestisce i registri. questo thread avrebbe un buffer che il thread principale può aggiungere messaggi ad esso

7

Considerare guardando Coro.

Dalla sua documentazione CPAN:

A differenza dei cosiddetti "fili Perl" (che non sono in realtà le discussioni reali, ma solo l'emulazione di Windows processo (vedere la sezione dello stesso nome per maggiori dettagli) portato su UNIX e come tale agisce come un processo), Coro fornisce uno spazio di indirizzamento condiviso completo, che rende molto semplice la comunicazione tra thread. Anche i thread di Coro sono veloci: disabilitare il codice di emulazione di processo di Windows nel perl e usare Coro può facilmente comportare un aumento della velocità da due a quattro volte per i tuoi programmi. Un benchmark di moltiplicazione con matrice parallela viene eseguito oltre 300 volte più velocemente su un singolo core rispetto agli pseudo-thread di Perl su un quad core utilizzando tutti e quattro i core.

Questo include Coro::AIO, un "file veramente asincrono e directory I/O", che potrebbe essere quello che stai cercando.

6

Avete davvero bisogno di scrivere i registri prima di tornare?

Supponendo che questo sia mod_perl Apache, supporta i gestori di cleanup che vengono attivati ​​per il processo figlio dopo che la risposta è stata restituita.

Sembra che ciò che VERAMENTE si desidera sia che la registrazione non interrompa il ritorno, i gestori di cleanup sembrerebbero farlo senza la necessità di async.

+0

Probabilmente hai ragione, ma al momento è un pessimo design e ha bisogno di sfruttare il fatto che ha alcuni dati in questo momento, non solo una semplice registrazione. – Timmy