I have a solution, but it requires making a couple of changes to Parallel::ForkManager.
Solution:
use strict; use warnings; use Parallel::ForkManager qw( ); my @data = ( ... ); my @tasks = ( sub { printf("%s\n", $_[0]); }, sub { exec('/home/working/perl1.pl', $_[0]); }, sub { exec('/home/perl2.pl', $_[0]); }, ); { my $task_id; my @idle = (0..$#tasks); my %alloc; my $pm = Parallel::ForkManager->new(scalar(@tasks)); $pm->run_pre_fork(sub { $task_id = shift(@idle); }); $pm->run_on_start(sub { my ($pid) = @_; $alloc{$pid} = $task_id; }); $pm->run_on_finish(sub { my ($pid) = @_; push(@idle, delete($alloc{$pid})); }); foreach my $data (@data) { my $pid = $pm->start and next; $tasks[$task_id]->($data); $pm->finish; } }
Changes to site/lib/Parallel/ForkManager.pm:
Change
$s->wait_children; if ($s->{max_proc}) { my $pid=fork();
in start to
$s->wait_children; $s->pre_fork; if ($s->{max_proc}) { my $pid=fork();
Add
sub run_pre_fork { my ($s,$code)=@_; $s->{pre_fork}=$code; } sub pre_fork { my ($s)=@_; $s->{pre_fork}->() if ref($s->{pre_fork}) eq 'CODE'; }
In reply to Re^5: Forking problem (manager)
by ikegami
in thread Forking problem UPDATED
by avi_learns_perl
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |