La Vida de un Vigilante

Estados de un Watcher

Durante su vida un vigilante esta en uno de varios estados que determinan su conducta. Las transiciones entre estados pueden ser solicitadas explícitamente mediante llamadas a métodos del objeto o implicitamente debido a la consecución de ciertas precondiciones.

Definición 5.2.1   El estado de un vigilante refleja a la vez su actividad y su registro. La actividad determina si el vigilante detecta la aparición de eventos. Estar registrado significa que el bucle sabe de la existencia del vigilante de modo que el vigilante pueda añadir peticiones a la cola

Cambios Implícitos

En general un watcher sólo puede estar en estado ACTIVE si sus atributos son suficientes: tan pronto como esta condición se incumple un vigilante en estado ACTIVE pasa al estado INACTIVE. Por ejemplo, un vigilante sin callback no podrá generar peticiones y no podrá estar ACTIVE.

Se consideran suficientes:

Tipo Precondiciones
todos callback definida
io Un manejador en fd o un timeout
timer Un timeout. Las llamadas repetidas son solo posibles si interval es válido
signal Una señal válida
idle -
var Los atributos poll y var deben estar definidos salvo para variables read-only como es el caso de $1
group Al menos un vigilante en el grupo

El siguiente ejemplo ilustra estas transiciones implícitas:

pp2@nereida:~/src/perl/Event$ cat -n implicitchange.pl
 1  #!/usr/bin/perl
 2  use warnings;
 3  use strict;
 4  use Event;
 5
 6  my $w = Event->io(timeout => 1, cb => sub { print "Working\n"} );  # started
 7  print "Watcher started\n" if $w->is_active;
 8  $w->timeout(undef);               # stopped implicitly
 9  print "Watcher stopped\n" unless $w->is_active;
10  $w->timeout(1);                   # still stopped
11  print "Watcher still stopped\n" unless $w->is_active;
12  $w->start;                        # restarted
13  print "Watcher restarted\n" if $w->is_active;
Al ejecutar este programa obtenemos la salida:
pp2@nereida:~/src/perl/Event$ implicitchange.pl
Watcher started
Watcher stopped
Watcher still stopped
Watcher restarted

La ausencia de algunos de estos atributos requeridos provoca la aparición de mensajes de advertencia o la negativa del sistema a cambiar los valores:

p2@nereida:~/src/perl/Event$ perl -wde 0
main::(-e:1):   0
  DB<1> use Event
  DB<2> $w = Event->signal(signal => 'INT')
Event: can't start '?? perl5db.pl:628]:2' without callback at (eval 8)[/usr/share/perl/5.8/perl5db.pl:628] line 2
  DB<3> $w = Event->signal(signal => 'INT', cb => sub {})
  DB<4> print "Watcher started\n" if $w->is_active
Watcher started
  DB<5> $w->signal('FUN')
Signal 'FUN' cannot be caught at /usr/share/perl/5.8/perl5db.pl line 628
  DB<6> print "Watcher activated\n" if $w->is_active
Watcher activated
  DB<9> p $w->signal
INT

Vigilantes sin Nada que Hacer

Otro cambio implícito se produce cuando un vigilante que no se repite y que no es explícitamente cancelado entra en un estado INACTIVE después de la ejecución de su manejador. Recuerde que un vigilante en estado INACTIVE consume memoria.

Sigue un ejemplo:

pp2@nereida:~/src/perl/Event$ cat -n active2inactive.pl
     1  #!/usr/bin/perl
     2  use warnings;
     3  use strict;
     4  use Event;
     5
     6  my $i = 0;
     7
     8  Event->timer(
     9    interval => 0.1,
    10    repeat   => 1, # TRUE
    11    cb       => sub {
    12      my @watchers = Event::all_watchers;
    13      warn "there are ",scalar(@watchers)," watchers now\n";
    14
    15      Event->timer(
    16        at => time,
    17        cb => sub { $i++; warn "$i. One shot callback!\n" },
    18      ),
    19    },
    20  );
    21
    22  Event::loop;

Al ejecutar el programa obtenemos la salida:

pp2@nereida:~/src/perl/Event$ active2inactive.pl
there are 1 watchers now
1. One shot callback!
there are 2 watchers now
2. One shot callback!
there are 3 watchers now
3. One shot callback!
there are 4 watchers now
4. One shot callback!
there are 5 watchers now
5. One shot callback!
there are 6 watchers now
6. One shot callback!
there are 7 watchers now
7. One shot callback!
there are 8 watchers now
8. One shot callback!
there are 9 watchers now
9. One shot callback!
there are 10 watchers now
10. One shot callback!
there are 11 watchers now
11. One shot callback!
there are 12 watchers now
12. One shot callback!
...

Métodos para Cambiar de Estado



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19