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.
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
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! ...
$w->start
:
Activa el watcher. Los constructores siempre invocan start
a menos que se
haya especificado la opción parked => 1
. Si existieran eventos de su interés
antes de su arranque, serán visibles al watcher.
$w->stop
:
Podemos desactivar un watcher llamando al metodo stop . Ello no afecta a las peticiones de este watcher que ya estuvieran en la cola.
$w->again
:
Reactiva un watcher desactivado
$w->cancel
:
Cancela un watcher. Se da de baja al watcher del bucle. Todas las referencias internas (de Event) al bucle son eliminadas. Si el watcher sobrevive será porque hay referencias externas