use strict; use warnings; use AnyEvent; use AnyEvent::FIFO; my $cv = AnyEvent::condvar; my $fifo = AnyEvent::FIFO->new( max_active => 1, # max "concurrent" callbacks to execute per slot ); my @q1 = (9,8,7,6,5,4,3,2,1); my @q2 = qw(a b c d e f g h i); foreach my $item (@q1) { $fifo->push( "number_queue", \&callback1, $item); } foreach my $item (@q2) { $fifo->push( "letter_queue", \&callback2, $item); } #do other async stuff here... $cv->recv; my ($q1t,$q2t); sub callback1 { my ($guard,$item) = @_; $q1t = AnyEvent->timer(after=>1, interval => 0, cb => sub { print "Got $item\n"; undef $guard; }); } sub callback2 { my ($guard,$item) = @_; $q2t = AnyEvent->timer(after=>1, interval => 0, cb => sub { print "Got $item\n"; undef $guard; }); }