【问题标题】:How to end program running after given time in Python如何在Python中给定时间后结束程序运行
【发布时间】:2012-07-09 08:05:10
【问题描述】:

我希望我的 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

【问题讨论】:

  • 您能否在超时后将SIGINT 传递给它,并将SIGINT 作为异常捕获并打印迄今为止的最佳结果并在该除块内退出?

标签: python multithreading time


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      在 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 循环之外捕获该异常,并打印您的最佳结果。

      【讨论】:

        【解决方案4】:

        如果您想使用线程执行此操作,一个好方法是使用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)
        

        【讨论】:

          猜你喜欢
          • 2018-09-05
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 1970-01-01
          • 1970-01-01
          • 2017-09-06
          • 2018-03-26
          • 1970-01-01
          相关资源
          最近更新 更多