Cómo finalizar el progtwig que se ejecuta después de un tiempo determinado en Python

Me gustaría que mi progtwig Python ejecute un algoritmo durante un número determinado de segundos y luego imprima el mejor resultado hasta el momento.

¿Cual es la mejor manera de hacerlo?

Intenté lo siguiente pero no funcionó (el progtwig siguió ejecutándose después de la impresión):

def printBestResult(self): print(self.bestResult) sys.exit() def findBestResult(self,time): self.t = threading.Timer(time, self.printBestResult) self.t.start() while(1): # find best result 

Código no probado, pero algo como esto?

 import time threshold = 60 start = time.time() best_run = threshold while time.time()-start < threshold: run_start = time.time() doSomething() run_time = time.time() - start if run_time < best_run: best_run = run_time 

En Unix, puede usar señales: este código se apaga después de 1 segundo y cuenta cuántas veces itera a través del bucle while en ese tiempo:

 import signal import sys def handle_alarm(args): print args.best_val sys.exit() class Foo(object): pass self=Foo() #some mutable object to mess with in the loop self.best_val=0 signal.signal(signal.SIGALRM,lambda *args: handle_alarm(self)) signal.alarm(1) #timeout after 1 second while True: self.best_val+=1 # do something to mutate "self" here. 

O bien, podría hacer que su alarm_handler produzca una excepción que luego atrape fuera del bucle while, imprimiendo su mejor resultado.

Si desea hacer esto con hilos, una buena manera es usar un Event . Tenga en cuenta que signal.alarm no funcionará en Windows, por lo que creo que subprocesos es su mejor apuesta a menos que en ese caso.

 import threading import time import random class StochasticSearch(object): def __init__(self): self.halt_event = threading.Event() def find_best_result(self, duration): halt_thread = threading.Timer(duration, self.halt_event.set) halt_thread.start() best_result = 0 while not self.halt_event.is_set(): result = self.search() best_result = result if result > best_result else best_result time.sleep(0.5) return best_result def search(self): val = random.randrange(0, 10000) print 'searching for something; found {}'.format(val) return val print StochasticSearch().find_best_result(3) 

Necesita una condición de salida, o el progtwig se ejecutará para siempre (o hasta que se quede sin memoria). Añade uno tú mismo.