Good day, Ryan, The problem with using 'sleep' in POE code is that POE isn't true pre-emptive multi-tasking, but rather cooperative multitasking at the process level. Different sessions are still running in the same process/thread, so any actions that will monopolize CPU time for a stretch will block all POE tasks. The general advice for POE tasks is that they should do no blocking calls in any individual event handling, in order to allow other sessions to run when the current one is idle.
The best way to have a session delay itself for a time is one of the methods described in http://search.cpan.org/~rcaputo/POE-1.280/lib/POE/Kernel.pm#Timer_Events_%28Delayed_Messages%29 . Take care, Mark. On Tue, Dec 1, 2009 at 4:38 PM, Ryan Chan <ryanchan...@gmail.com> wrote: > Hello, > > Consider my code below would like to execute the sleep() function in > parallel, using POE JobQueue component: > > > #============= > use strict; > use POE qw(Component::JobQueue); > > # Passive queue waits for enqueue events. > POE::Component::JobQueue->spawn( > Alias => 'passive', > WorkerLimit => 16, > Worker => \&spawn_a_worker, > Passive => { > Prioritizer => sub { 1 } > } > ); > > sub spawn_a_worker { > my ( $postback, @job_params ) = @_; > POE::Session->create( > inline_states => { > _start => \&start, > sleep => \&sleep > }, > args => [ > $postback, > �...@job_params, > ], > ); > } > > POE::Session->create( > inline_states => { > _start => \&init, > _stop => sub { print "END" } > } > ); > POE::Kernel->run(); > exit(0); > > sub init { > my $kernel = $_[KERNEL]; > > foreach ( 1 .. 10 ) { > $kernel->post( passive => enqueue => response => $_ ); > } > } > > sub start { > my $kernel = $_[ KERNEL ]; > print "Starting\n"; > $kernel->yield("sleep"); > } > > sub sleep { > print "Sleeping for 5 seconds\n"; > sleep 5; > } > > #========== > > It seems that tasks still block each other? If not, I would have all > message executed at the end of 5 seconds. >