2017-02-19 96 views
2

我正在計算一羣具有特殊屬性的數字理論家朋友的三角形。這些三角形中有無數個,但它們需要大量的計算能力才能找到。用戶輸入打破無限循環?

我們已經有一個無限循環遍歷不同的b,d組合。程序結束時,它會調用go(dict)函數來導出找到的三角形。目前,我們在開始時告訴程序運行的時間間隔。當我們意識到我們需要計算能力來做其他事情時,這會產生問題,但是程序仍然有幾個小時可以運行,並且我們不想失去已經計算出的三角形,而無需運行(dict)。

理想情況下,我們希望某些用戶輸入可以使程序打破循環,用任何當前版本的內存中的字典運行go(dict),然後退出。嘗試使用atexit.register(go,dict)不成功,因爲它在循環中多次調用,並在程序終止時運行很多次。

(請參見下面的縮寫循環代碼)

interval = eval(input("How many hours shall I run for? "))*3600 
starttime = time.time() 
dict = {} 
b = start_value 
while True: 
    for d in range (1, b): 
     compute stuff 

     if (condition): 
      add triangle to dict 

    if (time.time()-starttime)>interval: 
     go(dict) 
     return 
    b +=1 
+0

你正在使用什麼操作系統? – martineau

回答

4

這是例外 ,可用於:你按Ctrl + C中斷的過程中,你的代碼通過保存結果處理它:

while True: 
    try: 
     # your code here 
    except KeyboardInterrupt: 
     go(dict) 
     break 

需要注意的是,你不能從一個單一回路return,但你可以從break它,但是。

+0

感謝您提供清晰簡潔的答案。你對中斷是正確的,但是我們在特殊的三角形中尋找一個獨角獸,所以返回的是保存循環的函數(本質上放棄搜索),因爲循環後面的代碼只是一旦找到我們正在尋找的獨角獸三角形就會執行。 –

1

一兩件事你可以做的是使用except KeyboardInterrupt:當您發送中斷到腳本就會運行該塊,你可以把接管CTRL + C代碼退出乾淨 這裏有一個例子:

i = 0 
try: 
    while True: 
     i+=1 
except KeyboardInterrupt: 
    print 'caught INT' 
    print i 
1

使用的信號:

import signal 
interrupted = False # Used to break the loop when we send SIGINT 

# When SIGINT is received, set interrupted to True 
def signal_handler(signal, frame): 
    global interrupted 
    interrupted = True 

# Sets signal_handler to run if a SIGINT was received 
signal.signal(signal.SIGINT, signal_handler) 

interval = eval(input("How many hours shall I run for? "))*3600 
starttime = time.time() 
dict = {} 
b = start_value 
while True: 
    for d in range (1, b): 
     compute stuff 

     if (condition): 
      add triangle to dict 

     if (time.time()-starttime)>interval: 
      go(dict) 
      break 

     if interrupted: 
      go(dict) 
      break 
    b +=1 

現在,當我們打ctrl+c,我們設置interruptedTrue它運行go(dict)並打破循環。

+1

以後來這裏的人很好的參考! –