package TGrep; use strict; use threads; use MCE; use MCE::Queue; our $WORKERS = 4; sub tgrep(&@) { my $workers = $WORKERS; my $code = shift; my @results; my $Qin = MCE::Queue->new( fast => 1 ); my $Qout = MCE::Queue->new( queue => \@results ); my $mce = MCE->new( max_workers => $workers, user_func => sub { $Qout->enqueue( $code->() ? $_ : () ) while local $_ = $Qin->dequeue; } )->spawn; $Qin->enqueue( map{ ref $_[0] ? @{ $_ } : $_ } @_ ); $Qin->enqueue( (undef) x $workers ); $mce->run; return wantarray ? @results : \@results; } sub import { no strict 'refs'; my $pkg = caller; *{ $pkg . '::' . $_ } = *{ $_ } for qw[ tgrep ]; } 1;