Perl bounded worker pool over a queue
Perl
use strict;
use warnings;
use threads;
use Thread::Queue;
sub run_pool {
my ($jobs, $workers, $fn) = @_;
my $queue = Thread::Queue->new(@$jobs);
$queue->end;
my @threads = map { threads->create(sub {
my @out;
while (defined(my $job = $queue->dequeue)) {
my $ok = eval { $fn->($job); 1 };
push @out, { job => $job, ok => $ok ? 1 : 0, error => $ok ? undef : "$@" };
}
\@out;
}) } 1 .. $workers;
return map { @{ $_->join } } @threads;
}
my @res = run_pool([ 1 .. 6 ], 3, sub { $_[0] * 2 });
printf "%d jobs, %d ok\n", scalar @res, scalar grep { $_->{ok} } @res;