2010-02-09 17 views
5

¿Hay una manera simple de hacer asincronización en Perl? Tengo la siguiente lógica para una aplicación Apache:¿Cómo uso la programación asincrónica en Perl?

get request 
process request 
write to log 
return 

lo que quiero hacer es tener la "Escribir en el registro" parte de ser asíncrono, de modo que pueda hacer la parte de "retorno" lo antes posible.

+1

Por qué no usar sin bloqueo de llamadas para manejar la escritura a parte de la secuencia de comandos de registro? – daotoad

+0

¿Qué quiere decir con "aplicación Apache"? mod_perl? CGI? PSGI? servidor perl independiente con Apache como front-end? – dolmen

Respuesta

7

Lamentablemente, esto normalmente implica el marco POE, pero también hay una alternativa creciente (que querría probar primero) llamada AnyEvent.

Consulte this question for learning materials para obtener más información sobre el aprendizaje de POE. POE es un marco y tiende a consumir toda tu aplicación. Tampoco se mira como Perl, y sobresale. Creo que es una gran curva de aprendizaje para su aplicación típica.

AnyEvent es una continuación simple basada en una tarea asíncrona, debería ser capaz de resolverlo bastante bien solo con los documentos de CPAN.

Para su pregunta específica que usaría AnyEvent's AIO o POE's Read Write wheel

+0

gracias, me preguntaba si me perdí algo obvio, pero no pude encontrar ninguno. Como esto es parte de una aplicación Apache, ninguna de las soluciones parece atractiva. gracias a – Timmy

+2

puede usar un socket simple sin bloqueo para enviar los datos a un daemon de escritura de registro POE. Y, como dijo daotoad, siempre y cuando esté limitando un proceso de escritura por archivo, entonces probablemente pueda usar un identificador no bloqueante –

+2

AnyEvent también es más rápido y menos intrusivo que POE. De un antiguo usuario de POE, y ahora un usuario feliz de AnyEvent. – dolmen

3

puede utilizar hilos en Perl. crea un hilo que maneje los registros. este subproceso tendría un búfer en el que el subproceso principal puede agregar mensajes

7

Considere la posibilidad de mirar Coro.

Desde su documentación CPAN:

A diferencia de los llamados "hilos de Perl" (que en realidad no son temas reales, sino solamente la emulación proceso de ventanas (véase la sección del mismo nombre para más detalles) portado a Unix y, como tal, actúan como procesos), Coro proporciona un espacio de direcciones compartido completo, lo que hace que la comunicación entre hilos sea muy fácil. Y los hilos de Coro también son rápidos: deshabilitar el código de emulación de proceso de Windows en su Perl y usar Coro puede resultar fácilmente en un aumento de velocidad de dos a cuatro veces para sus programas. Un punto de referencia de multiplicación de matriz paralela se ejecuta 300 veces más rápido en un solo núcleo que los pseudo-hilos de perl en un núcleo cuádruple que utiliza los cuatro núcleos.

Esto incluye Coro::AIO, un "archivo de verdad asíncrona y el directorio de E/S", lo que podría ser lo que estás buscando.

6

¿Realmente necesita escribir los registros antes de volver?

Suponiendo que se trata de Apache mod_perl, admite los controladores de limpieza que se activan para el proceso secundario después de que se devuelve la respuesta.

Parece que lo que REALMENTE desea es que el registro no detenga la devolución, los gestores de limpieza parecen hacer eso sin la necesidad de asincronización en absoluto.

+0

Probablemente tengas razón, pero ahora es un mal diseño y necesita aprovechar el hecho de que ahora tiene algunos de los datos, no solo un simple registro. – Timmy

Cuestiones relacionadas