Mostrando entradas con la etiqueta manual. Mostrar todas las entradas
Mostrando entradas con la etiqueta manual. Mostrar todas las entradas

domingo, 7 de febrero de 2016

Manual POE::Session


El siguiente script crea una sesión de POE, luego arranca el Kernel. El kernel de POE pone en marcha la sesión, en este caso imprime tick cada un segundo y no termina nunca.

#!/usr/bin/perl -w
use POE; # auto-includes POE::Kernel and POE::Session

POE::Session->create(
  inline_states => {
     _start => sub { $_[KERNEL]->yield("next") },
     next   => sub {
       print "tick...\n";
       $_[KERNEL]->delay(next => 1);
     },
  },
);

POE::Kernel->run();
exit;


POE::Session es una tarea genérica orientada a eventos.
POE::Session y sus subclases traducen eventos del despachador genérico de POE::Kernel a llamadas convencionales al código de la aplicación. En términos de Desingn Patterns, las clases POE::Session son adaptadores que trabajan entre POE::Kernel y el código de la aplicación.
POE::Session tiene dos propósitos principales. Primero, mapea nombres de eventos con las piezas de código que los manejan. Segundo, mapea una consistente interface que despacha los eventos a sus manejadores.

martes, 2 de febrero de 2016

Manual POE


El siguiente script arranca 10 sesiones POE, cada una contando hasta 10. Cuando terminan de contar imprimen un mensaje de finalización y el script termina.

#!/usr/bin/perl -w
use strict;

use POE;  # Auto-includes POE::Kernel and POE::Session.

sub handler_start {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
  print "Session ", $session->ID, " has started.\n";
  $heap->{count} = 0;
  $kernel->yield('increment');
}

sub handler_increment {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
  print "Session ", $session->ID, " counted to ", ++$heap->{count}, ".\n";
  $kernel->yield('increment') if $heap->{count} < 10;
}

sub handler_stop {
  print "Session ", $_[SESSION]->ID, " has stopped.\n";
}

for (1..10) {
  POE::Session->create(
    inline_states => {
      _start    => \&handler_start,
      increment => \&handler_increment,
      _stop     => \&handler_stop,
    }
  );
}

POE::Kernel->run();
exit;


POE es un framework en Perl para programación multitarea y de redes cooperativa y orientada a eventos. Otros lenguajes tienen frameworks similares, como Python tiene Twisted y TCL tiene "the event loop".
POE provee una interface unificada para varios bucles de eventos, incluyendo select(), IO::Poll, Glib, Gtk, Tk, Wx, y Gtk2.
POE logra un alto grado de portabilidad gracias a ser enteramente escrito en Perl. Pero hay módulos opcionales en XS si la velocidad es más deseable que la portabilidad.
POE está diseñado en capas. Cada capa se construye sobre las demás. Los scripts son libres de usar POE en cualquier nivel de abstracción y los diferentes niveles pueden mezclarse. Sin embargo las abstracciones de alto nivel requieren más recursos que las de bajo nivel.