• Publicidad

sleep

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

sleep

Notapor danusol » 2010-04-22 09:32 @438

Hola, mi primer envío ¡y seguro que no será el último! Estoy aprendiendo Perl poco a poco siendo autodidacta.

Intentando aprender a usar fork() o al menos comprender cómo se usa y los resultados, me he encontrado con la función "sleep".

¿Para qué se usa? No entiendo el objetivo de que el programa pare cinco segundos o uno o una hora.
Por otro lado, he encontrado un tutorial de fork() para inútiles, pero ¿alguien sabe algún otro sitio dónde pueda encontrar ejemplos?

¡Gracias por vuestra ayuda!

P.D.: Sí, puede que fork() sea demasiado complejo para un novato, pero es que suelo trabajar con archivos muy grandes y me gustaría ver si puedo usar todos los nodos de mi ordenador para acelerar el resultado.
danusol
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2010-04-22 07:08 @339

Publicidad

Re: sleep

Notapor creating021 » 2010-04-22 14:21 @639

Para qué se usa? no entiendo el objetivo de que el programa pare cinco segundos o uno o una hora.

sleep se usa para suspender una ejecución durante un determinado tiempo, lo cual es muy útil si tienes que esperar a que cierto proceso termine, es por eso que aquella función se suela usar en bucles y bifurcaciones.

Lecturas de refuerzo: perldoc perlfork y perldoc -f sleep
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: sleep

Notapor explorer » 2010-04-22 15:51 @702

Bienvenido a los foros de Perl en Español, danusol.

Yo siempre he usado sleep() en dos ambientes: cuando se trata de intercambiar información con un usuario humano, o cuando se trataba de esperar a que un proceso terminase, siempre que sabía cuánto tiempo necesitaba esperar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: sleep

Notapor danusol » 2010-04-23 02:10 @132

¡Hola de nuevo! ¡Muchas gracias a los dos por vuestra rápida respuesta! ¡Así da gusto entrar en un foro!
Si lo entiendo bien, entonces para usar sleep() tiene que haber dos (o más) procesos, uno más largo que el otro. Y el proceso corto tiene que esperar a que el proceso largo termine para poder continuar porque necesita del resultado del proceso largo, ¿¿es algo así o estoy completamente perdido??
danusol
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2010-04-22 07:08 @339

Re: sleep

Notapor salva » 2010-04-23 02:37 @150

¿Para qué se usa? No entiendo el objetivo de que el programa pare cinco segundos o uno o una hora.


Uno de los usos más habituales es ejecutar una tarea repetidamente con una pausa entre cada ejecución. Algo así como...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(1) {
  haz_algo();
  sleep 60;
}
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El caso más típico: hacer un polling (explorer, ¿traducciones para polling?)
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: sleep

Notapor explorer » 2010-04-23 04:21 @223

sondeo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: sleep

Notapor danusol » 2010-04-26 05:18 @262

Mil gracias, pero, ¿para qué se necesita realizar una pausa después de tareas repetidas? ¿Es que el procesador necesita descansar después de algo intenso? ¿Se recupera memoria usada? ¿No podría hacer las tareas siguiente sin "descansar"?


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(1) {
  haz_algo();
  haz_algo_más();
  haz_otra_cosa();
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


D.
danusol
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2010-04-22 07:08 @339

Re: sleep

Notapor salva » 2010-04-26 05:37 @276

danusol escribiste:¿para qué se necesita realizar una pausa después de tareas repetidas?
  • Para no consumir ciclos de CPU inútilmente y dejar que otros procesos los utilicen
  • Para consumir menos energía eléctrica
  • Para no sobrecargar algún elemento externo (por ejemplo, cuando nuestro programa accede a alguna web)
  • Para esperar a que algo pase. Por ejemplo, que un campo en una base de datos cambie
  • Porque realmente no tienes ninguna otra cosa útil que hacer en ese tiempo.

¿Tú que haces cuando esperas el autobús? ¿te dedicas a correr dando vueltas alrededor de la marquesina o te sientas a esperar?
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: sleep

Notapor explorer » 2010-04-26 05:51 @286

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.001 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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: sleep

Notapor danusol » 2010-04-27 06:27 @310

Muchas gracias salva y explorer por vuestra ayuda. Con los ejemplos me arreglo mejor. Está claro que esto necesitará de varias vueltas cerebrales haciendo sleep() al acabar cada una.

Un saludo.

D.
danusol
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2010-04-22 07:08 @339


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados