Ya sabemos que cuando hay una tarea queremos que el ordenador la haga de la forma más rápida posible...
Pero no en todas las ocasiones...
Por ejemplo, imagínate que tienes un programa que recupera la información bursátil, desde una página web. Y sabes que esa información se refresca cada 15 minutos. Entonces, no tiene sentido que el programa, en el bucle infinito, esté constantemente descargándose la página, extrayendo los datos, y mostrándolos en pantalla. Basta que lo haga cada 15 minutos:
Using perl Syntax Highlighting
while ("tenga acciones en Red Hat") {
my $cotización_actual_Red_Hat
= descargar_cotización_NASDAQ
('RHT');
say
"Cotización actual: $cotización_actual_Red_Hat";
sleep 15
*60; # a dormir...
}Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Naturalmente, si este programa solo muestra información, no es necesario hacer un bucle infinito ni un sleep(): basta con crear una entrada en el crontab o Tareas programadas para que sea el propio sistema el que lance el programa cada cuarto de hora. Es un ejemplo para otro tipo de aplicaciones, que no terminan nunca, y que sí deben esperar un rato.
Este ejemplo vale también para los casos en que dos procesos, normalmente en distintas máquinas, tienen que esperarse entre sí, y no desean interrumpirse por medio de conexiones o interrupciones software o hardware, y les vale hacer un sondeo cada X segundos o minutos. Por ejemplo, hace unos años, hice muchos programas que, desde una máquina, se conectaban por SMB y FTP a otras, para bajarse los nuevos ficheros que hubiera en ellas. Y cada máquina origen tenía un ritmo de actualización distinto, así que cada proceso tenía un sleep() distinto.
O también, si hay un humano en mitad del proceso (somos algo más lentos que las máquinas). Por ejemplo, cada vez que el programa necesite mostrar información al usuario, el programa puede necesitar hacer una pausa de unos segundos, para sacar un mensaje, y luego seguir. Esto lo vemos ahora mucho en las páginas Ajax, cuando subimos ficheros por medio de HTTP: en la página se va refrescando cada pocos segundos el estado de subida de un fichero, o el estado de procesamiento de una tarea muy larga: no tiene sentido actualizar la información de la página cada décima de segundo. Con hacerlo cada segundo o tres segundos, le vale al usuario.
Otro ejemplo. Tengo un programa Perl que me saca en una pantalla el estado de uno de mis servidores:
* Actividad web (cuáles son los últimos webs que se han solicitado)
* Webs más activos en los últimos 7 días
* Actividad de correo electrónico (cuáles son los usuarios conectados en ese momento)
* Buzones más ocupados
Esta información la hace un proceso, en un bucle infinito, y se actualiza cada 60 segundos, pues no necesito verla con más resolución de tiempo (los tiempos marcados en pantalla no muestran segundos, solo hasta los minutos). Por eso hay un sleep(60).