2017-02-19 109 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

以后来这里的人很好的参考! –