Thanx to Lance, the script runs now like a charm, I did some mistakes in
handling the heap and some typos and stuff.

Thank u very much Lance!

The ready script below. Maybe it could be done (with some cleanup) in
the cookbook as enhancement of the Child Processes 3 [1] with timeouts
for the wheels/childs.

kind regards,
phaidros

[1] http://poe.perl.org/?POE_Cookbook/Child_Processes_3

Code:
######################################################################
#!/usr/bin/perl -w

$|=1; #unbuffered input

use strict;
use warnings;

#sub POE::Kernel::TRACE_REFCNT () { 1 }
use POE qw(Wheel::Run Filter::Reference);

our %alarms;
my @tasks = ("1_1","2_2","3_3","4_2","5_1");
my $count       = scalar @tasks;
print "we have $count tasks to do\n";
sub MAX_CONCURRENT_TASKS () { $count }

# variables and stuff done here

POE::Session->create
 ( inline_states =>
     { _start      => \&start_tasks,
       next_task   => \&start_tasks,
       task_result => \&handle_task_result,
       task_done   => \&handle_task_done,
       task_debug  => \&handle_task_debug,
       task_kill   => \&handle_task_kill,
     }
 );

sub start_tasks {
   my $heap = $_[HEAP];
   while ( keys( %{ $heap->{task} } ) < MAX_CONCURRENT_TASKS ) {
       my $next_task = shift @tasks;
       last unless defined $next_task;
       my @task_args = split(/_/, $next_task);
       my $task = POE::Wheel::Run->new
         ( Program      => sub { do_stuff($task_args[0], $task_args[1]) },
           StdoutFilter => POE::Filter::Reference->new(),
           StdoutEvent  => "task_result",
           StderrEvent  => "task_debug",
           CloseEvent   => "task_done",
         );
       print "wheel $task is running with: name \"$task_args[0]\" and
param \"$task_args[1]\"\n";
       my $timeout = 6;
       my $delay_id =
$poe_kernel->delay_set("task_kill",$timeout,$task->ID);
       $alarms{$task->ID} = $delay_id ;
       $heap->{task}->{ $task->ID } = $task;
   }
   return;
}

sub regx{
       #do sumthing
       my $result = shift;
       sleep(20);
       return("done");
}

sub do_stuff {
   my $name            = shift;
   my $param           = shift;
   my $filter          = POE::Filter::Reference->new();
   # some dummy action here
   my $ergebnis        = regx($name);
   my %result          =
     ( task            => $name,
       status          => "$ergebnis"
     );
   my $output          = $filter->put( [ \%result ] );
   print @$output;
}

sub handle_task_result {
   my $result = $_[ARG0];
   print "$result->{task} returned: $result->{status}\n";
}

sub handle_task_debug {
   my $result = $_[ARG0];
   print "Debug: $result\n";
}

sub handle_task_done {
   my ( $kernel, $heap, $task_id ) = @_[ KERNEL, HEAP, ARG0 ];
   print "finished task $task_id\n";
   my $delay_id = $alarms{$task_id};
   $kernel->alarm_remove($delay_id);
   delete $heap->{task}->{$task_id};
}

sub handle_task_kill {
   my ( $kernel, $heap, $task_id ) = @_[ KERNEL, HEAP, ARG0 ];
   return unless ($heap->{task}->{$task_id});
   print "killing task $task_id\n";
   $heap->{task}->{$task_id}->kill(9);
   delete $heap->{task}->{$task_id};
}

$poe_kernel->run();
print STDERR "kernel now finished. we can continue with sumthin else\n";
exit 0;

-- 
better burn out than fade away ..

Reply via email to