【问题标题】:making a programme run indefinitely in python使程序在python中无限期运行
【发布时间】:2010-09-20 17:15:54
【问题描述】:

有没有办法制作一个函数(我正在考虑的那些是我制作的简单函数的风格,它生成从 0 到一个点的斐波那契数列,以及两点之间的所有素数)无限期地运行。例如。直到我按下某个键或直到某个时间过去,而不是直到某个数字达到某个点?

另外,如果它是基于时间的,那么我有什么办法可以延长时间并从那个点重新开始,而不是从 0 重新开始?我知道有一个时间模块,我只是不太了解它。

【问题讨论】:

    标签: python time key indefinite


    【解决方案1】:

    最简单的方法就是编写一个无限循环的程序,然后按 control-C 停止它。如果没有更多描述,很难知道这是否适合您。

    如果您根据时间进行操作,则不需要生成器。您可以让它暂停以等待用户输入,例如“继续?[y/n]”,从标准输入读取,并根据您获得的内容退出循环。

    【讨论】:

      【解决方案2】:

      如果您确实希望您的函数运行并且仍然需要用户(或系统)输入,您有两种解决方案:

      1. 多线程
      2. 多进程

      这将取决于交互的精细程度。如果你只是想中断函数而不关心退出,那么多进程就可以了。

      在这两种情况下,您都可以依赖一些共享资源(多线程的文件或共享内存,多线程的具有关联互斥锁的变量)并在您的函数中定期检查该资源的状态。如果它被设置为告诉你退出,那就去做吧。

      多线程示例:

      from threading import Thread, Lock
      from time import sleep
      
      class MyFct(Thread):
          def __init__(self):
              Thread.__init__(self)
              self.mutex = Lock()
              self._quit = False
      
          def stopped(self):
              self.mutex.acquire()
              val = self._quit
              self.mutex.release()
              return val
      
          def stop(self):
              self.mutex.acquire()
              self._quit = True
              self.mutex.release()
      
          def run(self):
              i = 1
              j = 1
              print i
              print j
              while True:
                  if self.stopped():
                      return
                  i,j = j,i+j
                  print j
      
      def main_fct():
          t = MyFct()
          t.start()
          sleep(1)
          t.stop()
          t.join()
          print "Exited"
      
      if __name__ == "__main__":
          main_fct()
      

      【讨论】:

        【解决方案3】:

        您可以为此使用生成器:

        def finished():
            "Define your exit condition here"
            return ...
        
        def count(i=0):
            while not finished():
                yield i
                i += 1
        
        for i in count():
            print i
        

        如果您想更改退出条件,您可以将一个值传回生成器函数并使用该值来确定何时退出。

        【讨论】:

          【解决方案4】:

          与几乎所有语言一样:

          while True:
            # check what you want and eventually break
            print nextValue()
          

          你问题的第二部分更有趣:

          另外,如果它是基于时间的,那么无论如何我都可以延长时间并从那个点重新开始,而不是必须从 0 重新开始

          您可以在函数nextValue() 中使用yield 代替return

          【讨论】:

          • 除了“再次从那个点开始”可以解释为“在以后从最后计算的输出恢复执行程序”...
          【解决方案5】:

          如果您在主线程等待字符输入时使用子线程运行该函数,它应该可以工作。只要记住有一些东西可以停止子线程(在下面的全局运行线程示例中)

          例如:

          import threading, time
          runthread = 1
          def myfun():
             while runthread:
                print "A"
                time.sleep(.1)
          
          t = threading.Thread(target=myfun)
          t.start()
          raw_input("")
          runthread = 0
          t.join()
          

          就是这样

          【讨论】:

            【解决方案6】:

            如果你想基于时间退出,你可以使用信号模块的alarm(time)函数,并捕捉SIGALRM - 这是一个例子http://docs.python.org/library/signal.html#example

            您可以通过捕获 KeyboardInterrupt 让用户以理智的方式中断程序。只需从主循环外部捕获 KeyboardInterrupt 异常,然后进行任何您想要的清理。

            如果您想稍后从中断的地方继续,则必须添加某种持久性。我会将pickle 一个数据结构写入磁盘,您可以读回该数据结构以继续操作。

            我没有尝试过这样的事情,但你可以考虑使用类似 memoizing 的东西,并缓存到磁盘。

            【讨论】:

            • 是的......我正要回答这个问题,但它不是 python ......它是 UNIX !
            【解决方案7】:

            你可以做这样的事情来生成斐波那契数 1 秒然后停止。

            fibonnacci = [1,1]
            stoptime = time.time() + 1 # set stop time to 1 second in the future
            while time.time() < stoptime:
              fibonnacci.append(fibonnacci[-1]+fibonnacci[-2])
            
            print "Generated %s numbers, the last one was %s." % (len(fibonnacci),fibonnacci[-1])
            

            我不确定在每个循环中调用 time.time() 的效率如何 - 取决于您在循环内执行的操作,它最终可能会降低很多性能。

            【讨论】:

              猜你喜欢
              • 2012-01-30
              • 1970-01-01
              • 1970-01-01
              • 2014-05-30
              • 2017-05-18
              • 1970-01-01
              • 2022-06-22
              • 2015-07-31
              • 1970-01-01
              相关资源
              最近更新 更多