我正在为Number Theorist的朋友计算一堆具有特殊属性的三角形。这些三角形中有无数多个,但它们需要大量的计算能力才能找到。
我们有一个无限循环运行不同的b,d组合。当程序结束时,它调用go(dict)函数来导出它找到的三角形。目前,我们在开始时告诉程序运行的时间间隔。当我们意识到我们需要其他东西的计算能力时,这会引起问题,但是程序仍然需要几个小时才能运行,我们不想丢失已经通过退出程序计算的三角形而不运行go(dict)。 / p>
理想情况下,我们希望一些用户输入使程序打破循环,使用内存中保存的当前任何版本的字典运行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 :(得分:4)
这是 的例外情况可用于:按Ctrl + C中断进程,代码通过保存结果来处理它:
jsonArray
请注意,您不能从独立循环中while True:
try:
# your code here
except KeyboardInterrupt:
go(dict)
break
,但是您可以return
来自它。
答案 1 :(得分:1)
你可以做的一件事就是当你向脚本发送一个中断时,使用except KeyboardInterrupt:
接管ctrl + c它将运行这个块,你可以在其中放置代码以便干净地退出
这是一个例子:
i = 0
try:
while True:
i+=1
except KeyboardInterrupt:
print 'caught INT'
print i
答案 2 :(得分: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
时,我们将interrupted
设置为运行True
的{{1}}并打破循环。