如何在Python中给定时间后结束程序运行

时间:2012-07-09 21:14:47

标签: python multithreading time

我希望我的Python程序在给定的秒数内运行算法,然后打印到目前为止的最佳结果并结束。

最好的方法是什么?

我尝试了以下但是它不起作用(程序在打印后继续运行):

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

4 个答案:

答案 0 :(得分:4)

未经测试的代码,但是这样的话?

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

答案 1 :(得分:2)

在unix上,你可以使用信号 - 这段代码在1秒后超时,并计算它在那段时间内迭代while循环的次数:

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.

或者,您可以轻松地让alarm_handler引发异常,然后在while循环之外捕获,打印出最佳结果。

答案 2 :(得分:0)

如果你想用线程做这件事,一个好方法是使用Event。请注意,signal.alarm在Windows中不起作用,因此我认为线程是最好的选择,除非在这种情况下。

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)

答案 3 :(得分:-1)

您需要退出条件,否则程序将永远运行(或直到内存不足)。自己加一个。