my %results :shared; my $done :shared; async { my %comps; for my $i ( 1 .. 1e6 ) { $comps{ $i } = $i ** $i; } %results = %comps; $done++; # using $done = 1 doesn't want to work - more thought required! }->detach; my $c; while( sleep 1 ) { print "timer event"; last if $done; } pp scalar keys %results;