use threads qw( async ); use Thread::Queue qw( ); my $q = Threads::Queue->new(); async { while () { $q->enqueue(...); } $q->enqueue(...); }; async { while (<$fr_child_pipe>) { $q->enqueue(...); } $q->enqueue(...); }; while (defined(my $item = $q->dequeue())) { ... }