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 ..
