2012-04-13 15 views
9

Estoy trabajando en un proyecto de Perl que necesita una cola de mensajes FIFO para distribuir tareas entre varios procesos en una sola máquina (UNIX). El tamaño de la cola puede crecer hasta 1 millón de trabajos.Un sistema de colas para Perl

He intentado IPC::DirQueue, pero se vuelve terriblemente lento con 50k o más trabajos puestos en cola. ¿Cuáles son las buenas alternativas a este módulo que se pueden usar en Perl?

Respuesta

9

He tenido bastante éxito con el uso de ZeroMQ para este tipo de problema, tanto con Perl como con otros idiomas.

En mi experiencia, el módulo ZeroMQ parece ser el enlace más confiable para Perl actualmente.

+0

ZeroMQ se ve muy interesante, lo intentaré. –

4

No lo he probado en las condiciones que indica, pero Thread::Queue me ha resultado útil. Combinado con forks, se puede usar para comunicarse con procesos, siempre que dichos procesos hayan sido generados por el creador de la cola.

use forks; # If you want to use processes instead of threads. 
use Thread::Queue qw(); 

Un modelo de trabajador suele ser ideal.

my $q = Thread::Queue->new(); 

my @workers; 
for (1..$NUM_WORKERS) { 
    push @workers, async { 
     while (my $item = $q->dequeue()) { 
     ... 
     } 
    }; 
} 

# ... Enqueue requests [ $q->enqueue($request); ] ... 

# Signal termination 
$q->enqueue(undef) for [email protected]; 

# Collect workers. 
$_->join() for @workers; 
Cuestiones relacionadas