my $q = Thread::Queue->new(); my @threads = map { async { # Just nicer # You don't want dequeue_nb here!!! while ( defined( my $item = $q->dequeue() ) ) { # Don't kill the entire thread # if there's a problem with one job. eval { worker( $item ); 1 } or warn( $@ ); } }; } 1 .. $thread_limit; # Do this *after* the threads are created. # Otherwise, you could have a deadlock. # (Ok, not really since we don't place a size # limit on the queue so the queue can grow # to any size, but it's still nicer and # allows us to limit the size of the queue.) $q->enqueue( substr $_, 0, 6 ) for @file; # Make it so the threads exit when the queue becomes empty. $q->end; $_->join() for @threads;