所以我是python的初学者,正在研究文件系统事件处理程序。我遇到了看门狗 api,在那里我看到了一个我无法理解的多线程代码。
这是他们网站上发布的代码:
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
path = sys.argv[1] if len(sys.argv) > 1 else '.'
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
此代码运行无限循环并侦听某个文件夹并将看到的内容记录到控制台。我的疑问是在代码的底部。
所以你启动观察者。然后要求它进行无限循环,直到完成某个按键操作。我假设在“observer.start()”代码的某个地方,他们也设置了 daemon=True。在某些按键下,程序会跳出循环并停止观察者。在看门狗的 api 中,stop() 的定义说它停止了守护线程。
1) 然后它执行一个join()。但是这个加入有什么需要。我已经停止了守护线程。不是 join() 意味着等待所有线程停止然后才退出程序。我可以从代码中删除 join() 吗?删除它后,我的程序仍然可以正常工作。
2)我也不明白 while 循环内需要 sleep(1) 。如果我只是在那里放一个“通过”声明会发生什么。我假设while循环会消耗更多资源???以及我们将睡眠时间设置为 1 秒而不是 2-3 秒的原因,因为在最坏的情况下,用户可能需要等待 2-3 秒才能关闭程序。但我可能错了。