在Python中结束循环时停止While循环

时间:2018-06-28 15:00:25

标签: python-2.7

这可能是一个奇怪的请求。我有一个无限的While循环,每个循环持续约7分钟,然后程序进入睡眠状态几分钟,以使计算机冷却,然后重新启动。

外观如下:

import time as t

t_cooling = 120
while True:
    try:
        #7 minutes of uninterrupted calculations here
        t.sleep(t_cooling)
    except KeyboardInterrupt:
        break

现在,如果我想中断该过程,则必须等到程序休眠2分钟,否则运行周期中进行的所有计算都将被浪费。此外,计算涉及写入文件并使用multiprocessing,因此在计算阶段中断不仅是浪费,而且还可能损坏文件的输出。

我想知道是否有一种方法可以向程序发出信号,表明当前循环是它必须执行的最后一个循环,这样就不会有在错误时刻中断的风险。要增加一个限制,它必须是可通过命令行运行的解决方案。无法在运行程序的计算机上添加带有停止按钮的窗口。该机器具有基本的Linux安装,没有图形环境。这台计算机不是特别强大或不是新的,我需要使用尽可能多的CPU和RAM。

希望一切都足够清楚。

3 个答案:

答案 0 :(得分:2)

不太优雅,但是有效

#!/usr/bin/env python
import signal
import time as t

stop = False

def signal_handler(signal, frame):
    print('You pressed Ctrl+C!')
    global stop
    stop = True

signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C')

t_cooling = 1
while not stop:
    t.sleep(t_cooling)
    print('Looping')

答案 1 :(得分:1)

您可以使用单独的ThreadEvent向主线程发出退出请求的信号:

import time
import threading

evt = threading.Event()

def input_thread():
    while True:
        if input("") == "quit":
            evt.set()
            print("Exit requested")
            break

threading.Thread(target=input_thread).start()

t_cooling = 5
while True:
    #7 minutes of uninterrupted calculations here
    print("starting calculation")
    time.sleep(5)

    if evt.is_set():
        print("exiting")
        break

    print("cooldown...")
    time.sleep(t_cooling)

答案 2 :(得分:0)

为了完整起见,我在这里发布我的解决方案。这很原始,但是可以。

import time as t

t_cooling = 120
while True:
    #7 minutes of uninterrupted calculations here
    f = open('stop', 'r')
    stop = f.readline().strip()
    f.close()
    if stop == '0':
        t.sleep(t_cooling)
    else:
        break

我只需要创建一个名为stop的文件并在其中写入0。当将该0更改为其他值时,程序将在循环结束时停止。