use AnyEvent; my @queue = (9,8,7,6,5,4,3,2,1); my @timers; my $cv = AnyEvent->condvar; DoQueue(); # Do other things here... $cv->recv; sub DoQueue { my $i = pop @queue; if (!defined $i) { $cv->send; return; } print "Starting async operation $i\n"; $timers[$i] = AnyEvent->timer(after => 1, interval => 0, cb => sub { print "Finish async operation $i\n"; DoQueue(); }); }