in reply to read directory, fork processes

Why not create three worker threads. Whenever a new file arrives, add it to the queue. The workers pick stuff off the queue as they become idle.
use strict; use warnings; use threads; use Thread::Queue qw( ); my $num_workers = 3; sub process_file { my ($file) = @_; ... } my $q = Thread::Queue->new(); for (1..$num_workers) { async { while (defined(my $file = $q->dequeue())) { process_file($file); } }; } for (;;) { ... wait for new files ... $q->enqueue(@new_files); } $q->enqueue() for 1..$num_workers; $_->join() for threads->list();

Adding use forks; should make the above use processes instead of threads.