in reply to Implement Queue mechanism in Perl

Search CPAN.   There are many comprehensive workload management systems available, such as POE.

You will not have to “reinvent this wheel.”

Replies are listed 'Best First'.
Re^2: Implement Queue mechanism in Perl
by Anonymous Monk on Jan 11, 2011 at 19:26 UTC

    Could you show me how to modify this to provide a tasks completed progress indicator per the example above?

    #!/usr/bin/perl use warnings; use strict; use POE qw(Wheel::Run Filter::Reference); sub MAX_CONCURRENT_TASKS () { 3 } my @tasks = qw(one two three four five six seven eight nine ten); 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, sig_child => \&sig_child, } ); sub start_tasks { my ($kernel, $heap) = @_[KERNEL, HEAP]; while (keys(%{$heap->{task}}) < MAX_CONCURRENT_TASKS) { my $next_task = shift @tasks; last unless defined $next_task; print "Starting task for $next_task...\n"; my $task = POE::Wheel::Run->new( Program => sub { do_stuff($next_task) }, StdoutFilter => POE::Filter::Reference->new(), StdoutEvent => "task_result", StderrEvent => "task_debug", CloseEvent => "task_done", ); $heap->{task}->{$task->ID} = $task; $kernel->sig_child($task->PID, "sig_child"); } } sub do_stuff { binmode(STDOUT); # Required for this to work on MSWin32 my $task = shift; my $filter = POE::Filter::Reference->new(); sleep(rand 5); my %result = ( task => $task, status => "seems ok to me", ); my $output = $filter->put([\%result]); print @$output; } sub handle_task_result { my $result = $_[ARG0]; print "Result for $result->{task}: $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]; delete $heap->{task}->{$task_id}; $kernel->yield("next_task"); } sub sig_child { my ($heap, $sig, $pid, $exit_val) = @_[HEAP, ARG0, ARG1, ARG2]; my $details = delete $heap->{$pid}; # warn "$$: Child $pid exited"; } $poe_kernel->run(); exit 0;