NAME Parallel::Pipes - parallel processing using pipe(2) for communication and synchronization SYNOPSIS use Parallel::Pipes; my $pipes = Parallel::Pipes->new(5, sub { # this is a worker code my $task = shift; my $result = do_work($task); return $result; }); my $queue = Your::TaskQueue->new; # wrap Your::TaskQueue->get my $get; $get = sub { my $queue = shift; if (my @task = $queue->get) { return @task; } if (my @written = $pipes->is_written) { my @ready = $pipes->is_ready(@written); $queue->register($_->read) for @ready; return $queue->$get; } else { return; } }; while (my @task = $queue->$get) { my @ready = $pipes->is_ready; $queue->register($_->read) for grep $_->is_written, @ready; my $min = List::Util::min($#task, $#ready); for my $i (0..$min) { # write tasks to pipes which are ready $ready[$i]->write($task[$i]); } } $pipes->close; DESCRIPTION THIS IS EXPERIMENTAL. Parallel processing is essential, but it is also difficult: How can we synchronize our workers? More precisely, how to detect our workers are ready or finished. How can we communicate with our workers? More precisely, how to collect results of tasks. Parallel::Pipes tries to solve these problems with pipe(2) and select(2). App::cpm, a fast CPAN module installer, uses Parallel::Pipes. Please look at App::cpm <https://github.com/skaji/cpm/blob/master/lib/App/cpm.pm> or eg directory <https://github.com/skaji/Parallel-Pipes/tree/master/eg> for real world usages. METHOD new my $pipes = Parallel::Pipes->new($number, $code); The constructor, which takes number The number of workers. code Worker's code. is_ready my @ready = $pipes->is_ready; my @ready = $pipes->is_ready(@pipes); Get pipes which are ready to write. is_written my @written = $pipes->is_written; Get pipes which are written. close $pipes->close; Close pipes (also shutdown workers). AUTHOR Shoichi Kaji <skaji@cpan.org> COPYRIGHT AND LICENSE Copyright 2016 Shoichi Kaji <skaji@cpan.org> This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.