这可能是一个奇怪的请求。我有一个无限的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。
希望一切都足够清楚。
答案 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)
您可以使用单独的Thread
和Event
向主线程发出退出请求的信号:
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更改为其他值时,程序将在循环结束时停止。