2012-04-13 22 views
9

Tek bir makinede (UNIX) çeşitli işlemler arasında görevleri dağıtmak için bir FIFO mesaj kuyruğuna ihtiyaç duyan bir Perl projesi üzerinde çalışıyorum. Sıra boyutu 1M işlere kadar büyüyebilir.Perl için bir kuyruklama sistemi

IPC::DirQueue'u denedim, ancak 50k ile çok yavaş bir şekilde yavaşlıyor ve bu nedenle işler sıralanıyor. Perl'de kullanılabilecek bu modül için iyi alternatifler nelerdir?

cevap

9

Bu tür bir sorun için ZeroMQ kullanımıyla hem Perl hem de diğer dillerle oldukça başarılı oldum.

Deneyimlerime göre, ZeroMQ modülünün şu anda Perl için en güvenilir bağ olduğunu görüyoruz.

+0

ZeroMQ çok ilginç görünüyor, deneyeceğim. –

4

Listelediğiniz koşullar altında denemedim, ancak Thread::Queue bana yararlı olduğunu kanıtladı. forks ile birleştirildiğinde, bu işlemler kuyruk yaratıcısı tarafından oluşturulduğu sürece süreçlerle iletişim kurmak için kullanılabilir.

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

Bir çalışan modeli genellikle idealdir.

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;