2008-11-04 50 views
0

有沒有什麼辦法可以創建一個函數(我正在考慮的是我所生成的簡單類型的函數,它們可以從0到一個點生成斐波那契數列,兩點之間的所有素數)無限期地運行。例如。直到我按下某個鍵或直到時間過去,而不是直到某個數字達到某個點爲止?使程序無限期運行在python中

另外,如果它是基於時間的話,那麼有沒有什麼辦法可以延長時間,並從這一點再次開始,而不必從0開始重新開始?我知道有一個時間模塊,我只是不太瞭解它。

回答

1

最簡單的方法就是寫一個帶有無限循環的程序,然後點擊control-C來停止它。沒有更多的描述,很難知道這是否適合你。

如果你這樣做的時間,你不需要一個發電機。你可以暫停用戶輸入,像「Continue?[y/n]」,從標準輸入讀取,並取決於你得到的是退出循環還是不循環。

0

由於幾乎所有的語言:

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

你問題的第二部分是更有趣:

而且,如果它是基於時間,然後有反正我可以延長時間,並從這一點開始,而不是從0開始重新起動0

您可以使用yield而不是return在函數中nextValue()

+0

除了通過「再次從這個點開始」可以被解釋爲「在稍後的日期從上一次計算的輸出恢復執行該程序」...... – 2008-11-04 17:19:44

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

做到了這一點

0

如果你真的想你的函數運行,仍希望用戶(或系統)輸入,有兩種解決方法:

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

如果您要根據時間退出,你可以使用信號模塊的報警器(時間)功能,以及漁獲SIGALRM - 這裏是一個例子http://docs.python.org/library/signal.html#example

您可以讓用戶通過捕捉KeyboardInterrupt以一種健全的方式中斷程序。只需從主循環外部捕獲KeyboardInterrupt異常,並執行所需的清理即可。

如果您想在稍後停止的地方繼續,您將不得不添加一些排序持久性。我會將一個數據結構pickle寫入磁盤,以便您可以重新讀入以繼續操作。

我還沒有嘗試過這樣的事情,但你可以看看使用類似memoizing的東西,並緩存到磁盤。

+0

是......我要回答這個問題,但它不是Python ...它是UNIX! – PierreBdR 2008-11-04 18:33:27

-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()在每一個循環 - 這取決於你在循環裏面做什麼,它可能最終會走很多的表現了。

0

你可以使用一個發電機這樣的:

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 

如果你想改變的退出條件,你可以傳遞值回發生器功能,並使用該值來確定何時退出。