in reply to Processing a set of resources with a pool of forked children
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); } }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Processing a set of resources with a pool of forked children
by BrowserUk (Patriarch) on Feb 01, 2014 at 22:04 UTC | |
by shmem (Chancellor) on Feb 01, 2014 at 22:17 UTC |