• Publicidad

Implementación de un timeout en Perl

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

Implementación de un timeout en Perl

Notapor fgalves » 2007-04-02 01:44 @114

Hola a todos,

El caso es que necesito implementar un mecanismo de timeout en mi programa: si a los 20 minutos un proceso de generación de informes no ha terminado (puede terminar antes de dichos 20 minutos), pues dicho mecanismo debe activarse y terminar la generación de dicho informe justo en ese momento.
¿Alguien sabe de algún modulo Perl especializado en eso? Sino, ¿alguien podría darme algún ejemplo muy simple o algun link interesante?
Es la primera vez que debo implementar tal mecanismo y estoy un poco "bastante" perdido...

¡¡Muchas gracias!!
Saludos cordiales,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-04-02 02:55 @163

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

Notapor fgalves » 2007-04-02 03:15 @177

Muchas gracias como siempre explorer!!
Saludos!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2007-04-02 09:39 @443

Hola de nuevo,

Explorer, he mirado un poco la pagina que me has indicado y me ha quedado claro que el mecanismo clasico consiste en usar la funcion "alarm(segundos)", y asociar un evento a dicho "signal".

En mi caso concreto, me encuentro dentro de un bucle en el cual proceso ficheros que se encuentran en un directorio:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 for (my $i=$startIndex+1; $i<=$#files; $i++)
 {
# procesa siguiente fichero

}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Lo que deseo hacer es activar al principio un "timer" a 20 minutos y cuando dicho timer llegue a su limite, forzar la salida del bucle.

Lo que mas o menos he intuido que podria usar es lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
local $SIG{ALRM} = sub { last;};
alarm 1200;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Habria alguna otra manera de contar el tiempo pero sin pasar por la funcion "alarm()"?

Muchas gracias!
Saludos,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2007-04-02 09:54 @454

Otra forma, clásica, es, dentro del bucle, ir viendo en cada vuelta cuánto tiempo ha pasado. Para ello, al principio averiguamos en qué fecha estamos con la ayuda de time(). Luego en cada bucle hacemos la comparación.

Algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $antes = time();

while ( "bucle muy, muy, muy, pero que muy largo" ) {

    last if time() - $antes > 1200;   # Salimos si superamos los 20 minutos

    # proceso ...

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Naturalmente esto funciona si las vueltas del bucle se realizan dentro de la granularidad de un segundo. O dicho de otra manera, la precisión de esta forma de salida depende de la resolución media de cada vuelta. Si en "proceso" tenemos algo que nos ocupa más de un segundo, no podemos garantizar que el bucle salga exactamente a los 20min, sino que puede que tarde un poco más (20min + el tiempo de una vuelta).
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

Notapor fgalves » 2007-04-02 10:18 @470

muchisimas gracias Explorer!!

Creo que me voy a quedar con esta ultima solucion pues se trata de un proceso que puede durar mas de 4 horas (me refiero al bucle del que antes he hablado). Por lo tanto, no resulta para nada critico lo de 20 minutos + tiempo de 1 iteracion.

El problema de usar alarm(), es que me haria salir del bucle en cualquier momento, por ejemplo, mientras estoy procesando un fichero. Con la segunda solucion, puedo controlar mejor el lugar en el que hago la verificacion del timeout y salir del bucle una vez haya procesado completamente un fichero.

Gracias de nuevo y saludos!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621


Volver a Básico

¿Quién está conectado?

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

cron