use threads; use Thread::Queue; my $work_queue = Thread::Queue->new; $work_queue->enqueue($_) for ($start .. $end); #Fill our work queue my $work_queue = Thread::Queue->new; my $fetch_thread = threads->new( \&fetch, $work_queue, $fetched_queue); sub fetch { my $input_queue = shift; my $output_queue = shift; while ( my $fetch_this = $input_queue->dequeue ) { #Get content, put in scalar $output_queue->enqueue($content); last if ($input_queue->pending == 0) } } my $processed_queue = Thread::Queue->new; my $process_thread = threads->new( \&process, $fetched_queue, $processed_queue ); sub process { my $input_queue = shift; my $output_queue = shift; while ( my $process_this = $input_queue->dequeue ) { #process data, put in scalar $output_queue->enqueue($content); last if ($input_queue->pending == 0) } } while (my $processed_data = $processed_queue->dequeue) { #Assemble into final output last if ($input_queue->pending == 0) } #Make final output