in reply to Re^4: Forking problem (manager)
in thread Forking problem UPDATED
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'; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^6: Forking problem (manager)
by avi_learns_perl (Novice) on Mar 08, 2007 at 11:57 UTC |