Parallel::ForkManager
permite el uso de llamadas diferidas
o callbacks.
Las callbaks se establecen mediante los métodos del objeto
Parallel::ForkManager
run_on_start
, run_on_wait
y run_on_finish
.
Estas reciben como argumentos las referencias a las subrutinas que se ejecutarán en
las correspondientes situaciones.
Consulte el manual de Parallel::ForkManager
.
Modifique el ejemplo en la sección anterior para que
disponga de un hash con claves en los PID
y cuyos valores sean un hash anónimo conteniendo la información
asociada al proceso: enlace a descargar, estatus de finalización
y el PID
. Para actualizar el hash use callbacks
en el arranque y en la finalización de cada proceso.
Añada al programa un parámetro $limite
que controla el tiempo límite
de descarga. Si el tiempo es superado elimine los procesos
de descarga que no hayan terminado. Use para ello un callback
de espera (run_on_wait
).
Un manejador instalado con run_on_start
será ejecutado cada vez que se
crea con éxito un nuevo proceso hijo. El manejador es llamado con
dos argumentos:
start
)
El formato de llamada de run_on_wait
es run_on_wait($code, [$period])
.
La rutina referenciada por $code
es llamada por el
proceso padre cada vez que se crea un nuevo
hijo. Si se provee el segundo argumento $period
entonces la subrutina referenciada por $code
es llamada
periódicamente, aproximadamente cada $period
segundos.
No se le pasan parámetros a $code
.
El siguiente ejemplo muestra la instalación de manejadores
on_start
y on_wait
.
$pm->run_on_start( sub { my ($pid, $link)=@_; $pid_table{$pid} = {link => $link, pid => $pid, exit => undef}; } ); $pm->run_on_wait( sub { print "Time: ".(time()-$start_time)."\n"; for (keys %pid_table) { print "$_ => $pid_table{$_}->{link}\n"; } print "\n"; }, $period );
El manejador instalado mediante run_on_wait
muestra el tiempo transcurrido
desde $start_time
asi como el contenido
del hash %pid_table
:
Casiano Rodríguez León