用户输入打破无限循环?

时间:2017-02-19 18:35:01

标签: python loops dictionary

我正在为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

3 个答案:

答案 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}}并打破循环。