我有一位装饰师这样写道:import threading
from time import sleep
from functools import wraps
import sys
import os
def repeat_periodically(f):
""" Repeat wrapped function every second """
@wraps(f)
def wrap(self, *args, **kwargs):
def wrap_helper(*args, **kwargs):
try:
threading.Timer(1.0, wrap_helper).start()
f(self)
except keyboardInterrupt:
try:
sys.exit(1)
except:
os._exit(1)
wrap_helper()
return wrap
我不确定它是否每次调用它自己时都继续打开一个新线程,但是不管怎样,当我点击CTRL + C时,我无法终止该进程。我还在我修饰过的函数中添加了相同的try-except块:
^{pr2}$
我的程序继续运行,我在终端上看到的只是^C
换句话说,它只是保持日志记录,即使我试图用CTRL + C杀死它。在
更新:
我要指出的是,上述过程是从另一个线程开始的:tasks = [
{'target': f, 'args': (arg1)},
{'target': g},
]
for task in tasks:
t = threading.Thread(**task)
t.start()
特别是第二个任务会启动计时器。但是,如果我设置t.daemon = True,进程只运行一次并退出。第一个任务使用watchdog。我基本上使用了watchdog文档中的示例代码:def watch_for_event_file(Event):
path = sys.argv[1] if len(sys.argv) > 1 else '.'
event_handler = LoggingCreateHandler(Event)
observer = Observer()
observer.schedule(event_handler, path)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
(很抱歉所有更新)