2012-04-13 11 views
9

Sto lavorando a un progetto Perl che richiede una coda di messaggi FIFO per la distribuzione di attività tra diversi processi su una singola macchina (UNIX). La dimensione della coda può crescere fino a 1 milione di lavori.Un sistema di accodamento per Perl

Ho provato IPC::DirQueue, ma diventa terribilmente lento con 50k circa di processi in coda. Quali sono le buone alternative a questo modulo che possono essere utilizzate in Perl?

risposta

9

Ho avuto un discreto successo con l'utilizzo di ZeroMQ per questo tipo di problema, sia con Perl che con altri linguaggi.

Nella mia esperienza, il modulo ZeroMQ sembra essere il collegamento più affidabile attualmente per Perl.

+0

ZeroMQ sembra molto interessante, ci proverò. –

4

Non l'ho provato nelle condizioni elencate, ma Thread::Queue si è dimostrato utile per me. Combinato con forks, può essere utilizzato per comunicare con i processi, purché tali processi siano stati generati dal creatore della coda.

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

Un modello di lavoro è generalmente ideale.

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; 
Problemi correlati