Re: Poe Design Question

[email protected] (Rocco Caputo)
Newsgroups perl.poe
Message-ID <[email protected]>
What's your bottleneck?  If it's just speaking with modems, POE can do  
that asynchronously.  You may be able to simplify the design by  
pulling the jobs back into the main process.

-- 
Rocco Caputo - [email protected]


On Nov 24, 2009, at 15:00, Simon Taylor wrote:

> (updated)
>
> I have built a POE app which forks children, executes some work,  
> returns
> status back up the parent. All works fine.
>
> Currently this is all running from one Session.
>
> I now have a requirement to execute jobs which connect to the same  
> modem
> bank together.
>
> I was thinking I might structure it in the following way.
>
> Assume 4 modem banks with 20 jobs per modem bank.
>
>
>
> PARENT - Create Session + POE::Wheel::Run (PWR) one process per all  
> jobs
> which need to connect to modem bank
>
>           CHILD 1 - Create Session + PWR
>
>                                  CHILD 1.1 one process per job
>
>                                    ......
>
>                                  CHILD 1.20 one process per job
>
>           .....
>
>           CHILD 4 - Create Session + PWR one process per job
>
>
>
> This way I can use the heap of each session to manage the child jobs
> which are connected to each modem bank
>
>
>
> When using this mechanism to control how many jobs are passed to PWR  
> its
> dependent on the heap content which in the original approach would
> contain all jobs :-
>
> while (keys(%{$heap->{task}}) < $PARALLELISM ) {
>
>
>
> Is there a better/simpler way someone can think of to use PWR and the
> Session Heap to continue to execute jobs against different devices
> whilst always maintaining 4 simultaneous jobs in each PWR (until
> complete)
>
>
>
> Simon
>
>
>
>
>
> Currently start and manage starting tasks this way:-
>
>
>
> sub StartTasks {
>
> =Head3 _start
>
> Function called when POE wants to start tasks
>
> Shouldnt start any more than
> $self->GetBSHParalleism($SDU::BatchSectionsHandler::SectionName)
>
> When it does it spawns children
>
> Event handlers allow information to be passed back to the parent  
> process
>
> Mapping between state and function is done in the object states line  
> in
> the POE::Session->create in _IterateChildrenParallel
>
>
>
> =cut
>
>  my ($kernel, $self, $heap) = @_[KERNEL, OBJECT];
>
>  my ($child, $task);
>
>
>
>  $self->{_logger}->debug("Enter/Reentry");
>
>  while (keys(%{$heap->{task}}) < $PARALLELISM ) {
>
>      if (ref($self->{_children}) eq "ARRAY"){
>
>          $child = shift @{$self->{_children}};
>
>          last unless defined $child;
>
>          $self->{_logger}->debug("ARRAY "."Child = $child");
>
>          $task = POE::Wheel::Run->new(
>
>              Program      => sub {local *__ANON__ =
> "_StartTasksProgramSub";
>
>                                   $self->_CreateChild($child);
>
>                                   },
>
>              StdoutEvent  => "TaskResult",
>
>              StdoutFilter => POE::Filter::Reference->new(),
>
>              StderrEvent  => "TaskError",
>
>              CloseEvent   => "TaskDone",
>
>            );
>
>            $heap->{task}->{$task->ID} = $task;
>
>            $self->{_logger}->info("Created child Task/PID
> ".$task->ID."/".$task->PID);
>
>            $_[KERNEL]->sig_child($task->PID, 'sig_child');
>
>
>
>            # Wheel events include the wheel's ID.
>
>            $_[HEAP]{children_by_wid}{$task->ID} = $task;
>
>
>
>            # Signal events include the process ID.
>
>            $_[HEAP]{children_by_pid}{$task->PID} = $task;
>
>
>
>
>
>
>
>     } elsif (ref($self->{_children}) eq "HASH") {
>
>              $self->{_logger}->debug("HASH "."Child = $child");
>
>              $self->_CreateChild($child);
>
>     } else {
>
>              $self->{_logger}->debug("SCALAR "."Child = $child");
>
>              $self->_CreateChild($child);
>
>     } # If end
>
>  } # While end
>
> }
>
>
>
>
>
> Simon Taylor
>
> Development Team Lead NMS Applications
>
> Network Managed Services
>
> Nortel Networks
>
>
>
> (e) [email protected]
>
> (p) +44  1279 402291 ESN 6 742 2291
>
> (m) +44 7740 533743 ESN 6 748 3743
>
> (yim) setuk_nortel
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.