使程序在python中无限期运行

时间:2008-11-04 16:53:45

标签: python time key indefinite

有没有办法制作一个函数(我想到的是我所做的简单样式,它们生成从0到点的fibonnacci序列,以及两点之间的所有素数)无限期地运行。例如。直到我按某个键或直到某个时间过去,而不是直到一个数字达到某一点?

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

7 个答案:

答案 0 :(得分:1)

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

如果你这样做是基于时间的,你不需要发电机。您可以暂停用户输入,例如“继续?[y / n]”,从标准输入读取,并根据您获得的结果退出循环。

答案 1 :(得分:1)

您可以使用生成器:

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

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

答案 2 :(得分:0)

与几乎所有语言一样:

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

问题的第二部分更有趣:

  

另外,如果是基于时间,那么无论如何我可以延长时间并再次从那一点开始,而不是从0开始再次

您可以在函数yield

中使用return代替nextValue()

答案 3 :(得分:0)

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

例如:

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()

就是这样做

答案 4 :(得分:0)

如果你真的希望你的功能运行并且仍然想要用户(或系统)输入,你有两个解决方案:

  1. 多线程
  2. 多进程
  3. 这将取决于互动有多精细。如果你只想中断该功能而不关心退出,那么多进程就可以了。

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

    多线程示例:

    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()
    

答案 5 :(得分:0)

如果你想根据时间退出,你可以使用信号模块的闹钟(时间)功能,并抓住SIGALRM - 这是一个例子http://docs.python.org/library/signal.html#example

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

如果您想在上次停止的地方继续,则必须添加一些排序持久性。我会pickle一个数据结构到磁盘,你可以读回来继续操作。

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

答案 6 :(得分:-1)

你可以做这样的事情来生成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()的效率如何 - 取决于你在循环中所做的事情,它最终可能会带走很多性能。