用户输入来打破无限循环?

2024-06-16 09:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一位数论家的朋友计算一堆具有特殊性质的三角形。这些三角形有无穷多,但它们需要大量的计算能力才能找到。在

我们有一个无限循环,通过不同的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

Tags: 函数程序程序运行goforiftime朋友
3条回答

这就是异常的用途:按Ctrl+C来中断进程,代码通过保存结果来处理它:

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

请注意,您不能return来自独立循环,但是您可以从它break。在

您可以做的一件事是使用except KeyboardInterrupt:接管ctrl+c,当您向脚本发送一个中断时,它将运行这个块,您可以在其中放置代码以干净地退出 下面是一个例子:

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

使用信号:

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,它运行go(dict),并打破循环。在

相关问题 更多 >