Hi All,
Hope this isn't off-topic..
I want to:
*invoke multiple sub-jobs from a script, limited by the amount of
computers I have available/can send those jobs to.
*when I've launched as many jobs as I have machines, wait until one
completes and send that machine another job, and so as others free up
until no more jobs.
Seems like what I want is something along the lines of fork /
child_pids, and 'wait'.
I've played around with wait, but what I can't figure out is, if I
launch multiple jobs, how to react to the fact that one, but not all
have completed.
If I launch multiple jobs up to max_machines as it were, and use 'wait',
it appears to only wait for one job - the first - and then the others
are on their own. (e.g. the 'post-wait' print below is hit after the
first pid ends).
And if I 'waitpid', it serializes the jobs, defeating the parallelism I
so need!
Hope I'm making sense. Any help would be appreciated!
Cheers,
Mark
--------------
Code below using sleep to emulate dispatched, long living jobs. Waitpid
functionality commented out.
#!/usr/bin/perl -w
foreach $val ( 20, 25, 30 ) {
print "value is $val\n";
if (!defined($child_pid = fork())) {
die "cannot fork: $!";
} elsif ($child_pid) {
# I'm the parent
unshift ( @pids, $child_pid );
#print "waiting for $val..\n";
#waitpid($child_pid, 0);
#print "done waiting for $val..\n";
} else {
# I'm the child
#print "sleeping for $val seconds.\n";
system ( "sleep $val" );
print "$val is done sleeping, exiting.\n";
print return
exit;
}
}
print "outside of loop.\n";
print join ( "\n", @pids );
print "pre-wait..\n";
wait;
print "post-wait..\n";
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>