use strict; use warnings; use MCE::Hobo; use MCE::Shared; use Time::HiRes 'time'; my $workQueue = MCE::Shared->queue(); my $doneQueue = MCE::Shared->queue(); my $numWorkers = 4; my @tokens = ('aaa'...'zzz'); my $start = time; sub build_regex { my ($token) = @_; chop $token; $token .= 'a'; } MCE::Hobo->create(sub{DoWork($workQueue, $doneQueue)}) for 1..$numWorkers; $workQueue->enqueue($_) for @tokens; $workQueue->end(); my $count_finished = 0; my %result; while () { my ($key, $val) = $doneQueue->dequeue(2); last if (!$key && ++$count_finished == $numWorkers); $result{$key} = $val if $key; } $_->join() for MCE::Hobo->list; printf "duration: %0.03f seconds\n", time - $start; print scalar(keys %result), "\n"; # 16900 exit; sub DoWork { my ($work, $done) = @_; while (my $token = $work->dequeue()) { my $regex = build_regex($token); my @line_results = grep { $_ ne $token and /$regex/ } @tokens; $done->enqueue($token => \@line_results) if @line_results; } $done->enqueue(0,0); }