I'd go with IO::Select and IO::Handle (maybe IO::Pipe as well), these modules are core. The following may serve as inspiration.
use IO::Handle; use IO::Select; my %pids; # kid job description keyed on pid my $kids_fh; # pipe filehandles foreach kid keyed on fileno my $rset = IO::Select->new; local $| = 1; local $SIG{CHLD} = sub { my $waitedpid = wait; print "process $waitedpid ($pids{$waitedpid}) finished" if $waited +pid > 0; }; # spawn childeren for my $cmd( @cmds ) { ; my ($rh,$wh); for ($rh,$wh) { $_ = IO::Handle->new; $_->autoflush; } pipe($rh,$wh); if ((my $pid = fork) == 0) { # child code } else { # parent $rset->add($rh); $pids{$pid} = $cmd; $kids_fh{fileno($rh)} = $pid; } } # now interact with kids while(1) { last unless $rset->handles; foreach my $rh (sort { fileno $a <=> fileno $b } $rset->can_read) +{ my $response = do { local $/; <$rh> }; ... ... $rset->remove($rh); } }
In reply to Re: Processing a set of resources with a pool of forked children
by shmem
in thread Processing a set of resources with a pool of forked children
by mikeym
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |