The
correct
答案是使用python stdlib的
threading.Event
当然,你可以调低你的睡眠间隔,使你的睡眠时间非常短,但如果你
实际上
想每60秒运行一次你的循环? 那么你需要做更多的工作来确定是该运行还是继续睡觉。 此外,你
still
技术上阻断,但只在短时间内。 与
threading.Event
形成对比。
from threading import Event
exit = Event()
def main():
while not exit.is_set():
do_my_thing()
exit.wait(60)
print("All done!")
# perform any cleanup here
def quit(signo, _frame):
print("Interrupted by %d, shutting down" % signo)
exit.set()
if __name__ == '__main__':
import signal
for sig in ('TERM', 'HUP', 'INT'):
signal.signal(getattr(signal, 'SIG'+sig), quit);
main()
当信号处理程序调用exit.set()
时,主线程的wait()
调用将立即 be interrupted.
现在,你可以用Event
来表示还有更多工作要做,等等。但在这种情况下,它可以作为一个方便的指标,表明我们想退出(例如,while not exit.is_set()
部分)。
你也可以选择在你的while
循环之后放置任何清理代码。