use strict; use warnings; use Parallel::ForkManager; use Test::More qw( no_plan ); use Data::Dumper; my $letters = [ qw(a b c) ]; # the order of the concatenated letters doesn't matter, as long as we get all three letters my $content; ok( index( $content = concatenate_parallel($letters), 'b' ) > 0, "it contains b, total content: $content" ); # fast, but doesn't work ok( index( $content = concatenate_serial($letters), 'b' ) > 0, "it contains b, total content: $content" ); # works, but slow #works, but slow sub concatenate_serial { my $letters = shift; my $content=''; foreach my $letter ( @$letters ) { sleep 3; #something happens that takes noticeable time, like fetch a url $content .= $letter; } print "serial content: $content\n"; return $content } # fast, but doesn't work sub concatenate_parallel { my $letters = shift; my $pm=new Parallel::ForkManager(10); my $content=''; foreach my $letter ( @$letters ) { $pm->start and next; sleep 3; #something happens that takes time, like fetch a url $content .= $letter; $pm->finish; } $pm->wait_all_children; return $content }