Vigilando Los Tiempos Ociosos

Un vigilante de tipo idle detecta cuando el sistema esta ocioso, esto es: cuando no hay eventos pendientes. Permite dos atributos adicionales min => $seconds y max => $seconds.

pp2@nereida:~/src/perl/Event$ cat -n idlewatcher.pl
 1  #!/usr/bin/perl
 2  use warnings;
 3  use strict;
 4
 5  use IO::File;
 6  use Math::BigFloat qw(:constant);
 7  use constant VALUE => 0.001;
 8  use Event qw{loop unloop};
 9
10  STDIN->blocking(0);
11  STDERR->autoflush(1);
12  print "Press CTRL_D to finish, any other key to monitor the computation\n";
13
14  my $idle = Event->idle(
15    data => VALUE,
16    cb => sub {
17      $_[0]->w->data($_[0]->w->data+VALUE);
18    },
19    repeat => 1
20  );
21
22  my $io = Event->io(
23    fd => \*STDIN,
24    cb => sub {
25      warn "Partial result: ", $idle->data,".\n";
26      my $bytes = sysread(STDIN, $_, 4);
27      unloop if (defined($bytes) and ($bytes == 0));
28    }
29  );
30  loop;
Event proporciona un atributo especial para los objetos watcher con nombre data. Puede ser utilizado por el programador para guardar información en el objeto watcher.

El único argumento que se pasa al manejador o callback es el objeto evento que ha de ser manejado. El método w de dicho objeto permite obtener el vigilante.

Cuando se ejecuta el programa anterior se obtiene una salida similar a esta:

pp2@nereida:~/src/perl/Event$ idlewatcher.pl
Press CTRL_D to finish, any other key to monitor the computation
                            <-- retorno de carro 
Resultado parcial: 0.179.
                            <-- retorno de carro 
Resultado parcial: 0.249.
                            <-- retorno de carro 
Resultado parcial: 0.346.
                            <-- retorno de carro 
Resultado parcial: 0.447.
                            <-- retorno de carro 
Resultado parcial: 0.54.
^D <-- El usuario pulsa CTRL-D en un sistema Unix para terminar

Ejercicio 5.2.1   Ponga la opción min = 0 en el ejemplo anterior. ¿Que observa?

Casiano Rodríguez León
2010-03-22