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};
> }
>

Reply via email to