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