you might also want to look at PoCo::Child for inspiration -----Original Message----- From: Andy Levine [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 09, 2004 3:23 AM To: [EMAIL PROTECTED] Subject: RE: small wishes to poe::wheel::run can't figure out.
Michael, > > I would like to get an error_level for each program i run in parallel... Pass the param "ErrorEvent" when you instantiate the POE::Wheel::Run to trap errors. > And it would also be nice to get a value back so i can track which program > that return a > given answer... > I get program exit codes by trapping SIGCHLD to tell when my child process die. In your 'start' handler, add something like this: $kernel->sig(CHLD => '__sig_child'); Then handle the __sig_child event. The program exit code is one of the parms, as follows: sub onSIGCHLD { my($self, $heap, $signalname, $kidPID, $kidRC) = @_[ OBJECT, HEAP, ARG0..ARG2 ]; > Thanks a lot in advance... > > Michael , Denmark. > > ----------------- snip ------------------- > > #!/usr/bin/perl > > use warnings; > use strict; > > use POE; > use POE::Wheel::Run; > > my $time1=time(); > > # Start a multitasking session to manage several child processes. Map > # each event to a function which will handle it. Run POE::Kernel, > # which manages the session's activity. run() will return when the > # session is done, and so we exit. > > > POE::Session->new > ( _start => \&start_processes, > process_stdout => \&read_stdout, > process_stderr => \&read_stderr, > process_closed => \&cleanup_proc_wheel, > ); > > POE::Kernel->run(); > > my $time2=time(); > my $usedtime=$time2-$time1; > > print"$time2 - $time1 - $usedtime\n"; > > exit 0; > > # Start a number of child processes. Record their abstractions > # (wheels) in the session's local storage (its "heap"). All the > # process events include the IDs of the wheels that have activity. > # We'll use that later to clean up after finished processes. > > > > sub start_processes { > my $session_storage = $_[HEAP]; > my $nr; > my @servers; > my $t; > my $command="uptime"; > > $nr = @servers = qw(xxx.xxx.xxx.xxx); > > for (1..1) { > for ($t=0;$t<$nr;$t++) { > my $program="ssh $servers[$t] $command"; > my $proc_wheel = POE::Wheel::Run->new > ( Program => "$program", > StdoutEvent => "process_stdout", > StderrEvent => "process_stderr", > CloseEvent => "process_closed", > ); > $session_storage->{$proc_wheel->ID} = $proc_wheel; > } > } > } > > # Process stdout and stderr from the child process. > > sub read_stdout { > my ($stdout, $proc_wheel_id) = @_[ARG0, ARG1]; > print "Wheel $proc_wheel_id stdout: $stdout\n"; > } > > sub read_stderr { > my ($stderr, $proc_wheel_id) = @_[ARG0, ARG1]; > print "Wheel $proc_wheel_id stderr: $stderr\n"; > } > > # Clean up after a process when it's done. > > sub cleanup_proc_wheel { > my ($session_storage, $proc_wheel_id) = @_[HEAP, ARG0]; > delete $session_storage->{$proc_wheel_id}; > } >