special thanx to xantus from #poe / irc.perl.org who saved my day with
his helping and debugging the script. the most corrections came directly
from him.
the poe people are great :)

regards,
phai


> ######################################################################
> #!/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;
> 

Reply via email to