Okay, I spoke too soon. Accessing a hash defined in the parent IS read/writable from run_on_finish().
my %rc_hash = ();
my $MAX_PROCESSES = 120;
my $pm = new Parallel::ForkManager($MAX_PROCESSES);
$pm->run_on_finish(
sub {
my ($pid, $exit_code, $ident) = @_;
print "run_on_finish: $ident (pid: $pid) exited " . "with cod
+e: [$exit_code]\n";
$rc_hash{$pid} = $exit_code;
}
);
$pm->run_on_start(
sub {
my ($pid,$ident)=@_;
print "** $ident started, pid: $pid\n";
}
);
for(my $i=0; $i< @hosts; $i++){
$pm->start($hosts[$i]) and next;
system(@some_command);
$return_code = $? >> 8;
$pm->finish($return_code);
}
foreach my $key (keys %rc_hash){
print "$key => $rc_hash{$key}\n";
}
I made an incorrect assumption.. What I was trying to do earlier is use a database handle from run_on_finish() and that didn't work, so I thought it applied to all other variables. I am not sure why accessing a hash would work, but accessing a db handle wouldn't. Is this possible?
my $dbh = DBI->connect("DBI:mysql:database=mydb;host=$DB", "user",
+"pass", {'RaiseError' => 1});
my $MAX_PROCESSES = 120;
my $pm = new Parallel::ForkManager($MAX_PROCESSES);
$pm->run_on_finish(
sub {
my ($pid, $exit_code, $ident) = @_;
print "run_on_finish: $ident (pid: $pid) exited " . "with
+code: [$exit_code]\n";
insert_into_db(\$dbh, $pid, $exit_code);
+
}
);
$pm->run_on_start(
sub {
my ($pid,$ident)=@_;
print "** $ident started, pid: $pid\n";
}
);
for(my $i=0; $i< @hosts; $i++){
$pm->start($hosts[$i]) and next;
system(@some_command);
$return_code = $? >> 8;
$pm->finish($return_code);
}
$dbh->disconnect();
sub insert_into_db{
my $dbhdl = shift;
my $pid = shift;
my $ret_code = shift;
$$dbhdl->do(INSERT INTO system_results ... .. );
}
If I can't use the db handle from run_on_finish(), I can still add the return code to %rc_hash and process them after $pm->finish(). Is this the right thing to do? thanks for the speedy responses. I hope I explained my problem a little better this time around. |