use strict; use warnings; use MCE::Child; use MCE::Channel; use Time::HiRes 'time'; my $workQueue = MCE::Channel->new(impl => 'Mutex'); my $numWorkers = 4; my @tokens = ('aaa'...'zzz'); my $start = time; sub build_regex { my ($token) = @_; chop $token; $token .= 'a'; } MCE::Child->create(sub{DoWork($workQueue)}) for 1..$numWorkers; $workQueue->enqueue($_) for @tokens; $workQueue->end(); my %result = map { %{ $_->join() } } MCE::Child->list; printf "duration: %0.03f seconds\n", time - $start; print scalar(keys %result), "\n"; # 16900 exit; sub DoWork { my ($workQueue) = @_; my %result; # store locally while (my $token = $workQueue->dequeue()) { my $regex = build_regex($token); my @line_results = grep { $_ ne $token and /$regex/ } @tokens; $result{$token} = \@line_results if @line_results; } return \%result; }