2012-04-13 16 views
9

Pracuję nad projektem Perl, który potrzebuje kolejki komunikatów FIFO do dystrybucji zadań między kilkoma procesami na jednym komputerze (UNIX). Rozmiar kolejki może wzrosnąć do 1 mln zadań.System kolejkowania dla Perl

Próbowałem już IPC::DirQueue, ale staje się strasznie powolny z 50k lub więcej zadań zakolejkowanych. Jakie są dobre alternatywy dla tego modułu, które mogą być używane w Perlu?

Odpowiedz

9

Odniosłem całkiem niezły sukces przy użyciu ZeroMQ do tego rodzaju problemów, zarówno z Perl jak i innymi językami.

Z mojego doświadczenia wynika, że ​​moduł ZeroMQ jest obecnie najbardziej wiarygodnym wiązaniem dla Perla.

+0

ZeroMQ wygląda bardzo interesująco, spróbuję. –

4

Nie próbowałem go w warunkach, które wymieniasz, ale Thread::Queue okazało się przydatne dla mnie. W połączeniu z forks może być używany do komunikacji z procesami, o ile procesy te zostały zainicjowane przez twórcę kolejki.

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

Model pracownika jest zwykle idealny.

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; 
Powiązane problemy