2017-02-19 16 views
2

Number Theoristの友人のための特別なプロパティを持つ三角形の束を計算することに取り組んでいます。無限に多くの三角形がありますが、それらを見つけるには多くの計算力が必要です。無限ループを壊すユーザー入力?

異なるb、dの組み合わせで無限ループが実行されています。プログラムが終了すると、go(dict)関数を呼び出して見つかった三角形をエクスポートします。現在、プログラムの開始時に実行する時間間隔を指定します。これは、他の何かのためにコンピューティングパワーが必要であることが分かったときに問題を引き起こしていますが、プログラムはまだ実行時間があり、go(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

これはある 例外のために使用することができるものです

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

なお、あなたができない、スタンドアロンのループからreturn、しかしすることができます、それからbreakが、しかし。

+0

明快で簡潔な答えをありがとう。あなたはブレークについては正しいですが、特殊な三角形の中でユニコーンを探していますので、ループを保持する関数のための戻り値(本質的に検索をあきらめます)があります。私たちが探しているユニコーンの三角形が見つかると実行されます。 –

1

一つのことは、あなたがスクリプトに割り込みを送信するときにここであなたが置くことができ、それは、このブロックを実行しますexcept KeyboardInterrupt:を使用してCtrl + Cを引き継ぐです(以下省略ループコードを参照してください)ここできれいに を終了するコードは例です:あなたは、プロセスを中断するには、Ctrl + Cを押すと、あなたのコードは、結果を保存することで、それを処理します:

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

用いて信号は:私たちはctrl+cを打ったとき

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 

は今、私たちは go(dict)を実行し、ループを壊す Trueinterruptedを設定します。

+1

将来ここに来る人のための良いリファレンス! –