Práctica: Callbacks en ForkManager

El módulo 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:

  1. El PID del proceso
  2. El identificador del proceso (si fué proveído en la llamada a 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
2010-03-22