2010-05-14 20 views
15

Lo siento, esta es probablemente una pregunta terrible. Tengo SOLO empecé a aprender Python hoy. He estado leyendo un byte de Python. Ahora mismo tengo un proyecto para Python que implica tiempo. No puedo encontrar nada relacionado con el tiempo en Byte of Python, así que le preguntaré:¿Se ejecuta una secuencia de comandos python durante un período de tiempo especificado por el usuario?

¿Cómo puedo ejecutar un bloque durante un tiempo especificado por el usuario y luego interrumpirlo?

Por ejemplo (en algunos pseudo-código):

time = int(raw_input('Enter the amount of seconds you want to run this: ')) 
while there is still time left: 
    #run this block 

o incluso mejor:

import sys 
time = sys.argv[1] 
while there is still time left: 
    #run this block 

Gracias por cualquier ayuda. Además, guías y tutoriales adicionales en línea serían muy apreciados. Realmente me gusta Byte of Python. Sumérgete en Python no puede mantener mi atención, sin embargo. Supongo que debería aguantarlo e intentar leerlo con más ahínco.

Respuesta

16

Recomiendo generar otro thread, por lo que es daemon thread, luego sleeping hasta que desee que la tarea muera. Por ejemplo:

from time import sleep 
from threading import Thread 

def some_task(): 
    while True: 
     pass 

t = Thread(target=some_task) # run the some_task function in another 
           # thread 
t.daemon = True    # Python will exit when the main thread 
           # exits, even if this thread is still 
           # running 
t.start() 

snooziness = int(raw_input('Enter the amount of seconds you want to run this: ')) 
sleep(snooziness) 

# Since this is the end of the script, Python will now exit. If we 
# still had any other non-daemon threads running, we wouldn't exit. 
# However, since our task is a daemon thread, Python will exit even if 
# it's still going. 

El Python intérprete se apagará cuando todos los hilos no daemon han salido. Entonces, cuando su hilo principal sale, si el único otro hilo que se ejecuta es su tarea que está ejecutando en un hilo daemon por separado, entonces Python simplemente saldrá. Esta es una forma conveniente de ejecutar algo en segundo plano si desea poder salir sin preocuparse por hacer que se cierre manualmente y esperar a que se detenga.

Por lo tanto, en otras palabras, la ventaja que tiene este enfoque respecto al uso de sleep en un bucle for es en ese caso que debe codificar su tarea de manera que se divida en trozos discretos y luego verifique cada tanto si Tu tiempo se ha acabado. Lo cual podría estar bien para sus propósitos, pero puede tener problemas, como si cada fragmento lleva una cantidad de tiempo significativa, lo que hace que su programa se ejecute durante mucho más tiempo de lo que el usuario ingresó, etc. Si esto es un problema para usted depende de la tarea que está escribiendo, pero pensé que mencionaría este enfoque en caso de que fuera mejor para usted.

+0

Disculpa, ¿puedes comentar algo de eso? No me he atrevido a enhebrar y dormir. Por lo que entiendo por tu respuesta: ¿despertar del sueño rompe el hilo? – Rob

+0

@Rob: He agregado más explicaciones y varios comentarios al código. Avíseme si algo en particular no está claro. –

+0

En realidad lo has dejado todo muy claro. Esto parece mucho más eficiente que verificar la hora repetidamente. Muchas gracias – Rob

13

Pruebe time.time(), que devuelve la hora actual como el número de segundos desde un tiempo establecido llamado epoch (medianoche del 1 de enero de 1970 para muchas computadoras). He aquí una manera de utilizarlo:

import time 

max_time = int(raw_input('Enter the amount of seconds you want to run this: ')) 
start_time = time.time() # remember when we started 
while (time.time() - start_time) < max_time: 
    do_stuff() 

lo que vamos a bucle mientras el tiempo desde que empezamos es menor que el máximo especificado por el usuario. Esto no es perfecto: lo más notable es que si do_stuff() tarda mucho tiempo, no nos detendremos hasta que finalice y descubriremos que ya hemos superado nuestra fecha límite. Si necesita poder interrumpir una tarea en progreso tan pronto como transcurra el tiempo, el problema se vuelve más complicado.

+0

Yo necesito ser capaz de interrumpir la tarea en curso, en realidad. ¿Pero no sería una modificación simple como 'if (time.time() - start_time)> max_time: break'? Por favor corrígeme si estoy equivocado – Rob

+2

¡Claro! Eso funcionará bien, solo debes asegurarte de ejecutar esa prueba entre pequeños fragmentos de ejecución. – Etaoin

+0

Muchas gracias, Etaoin! – Rob

4

Si estás en Linux, y quiere interrumpir un proceso de larga duración, utilice la señal :

import signal, time 

def got_alarm(signum, frame): 
    print 'Alarm!' 

# call 'got_alarm' in two seconds: 
signal.signal(signal.SIGALRM, got_alarm) 
signal.alarm(2) 

print 'sleeping...' 
time.sleep(4) 

print 'done' 
Cuestiones relacionadas