我正在使用"看门狗" api继续检查我的文件系统中的文件夹中的更改。无论该文件夹中的文件发生什么变化,我都会将它们传递给一个特定的函数,该函数为我传递的每个文件启动线程。
但看门狗或任何其他文件系统观察者api(据我所知),逐个文件通知用户,即当文件来时,他们会通知用户。但我希望它一次通知我一大堆文件,以便我可以将该列表传递给我的函数并使用多线程。目前,当我使用" watchdog"时,它一次通知我一个文件,我只能将那个文件传递给我的函数。我想一次传递许多文件,以便能够进行多线程处理。
我想到的一个解决方案是:你看到当你在一个文件夹中复制一堆文件时,操作系统会显示一个进度条。如果我可以在进度条完成时收到通知,那么这对我的问题来说是一个完美的解决方案。但我不知道这是否可能。
另外我知道看门狗是一个轮询API,而观看文件系统的理想API将是像pyinotify一样的中断驱动api。但我没有找到任何中断驱动的API,也没有跨平台。 iWatch很好,但仅适用于Linux,我想要所有操作系统的东西。因此,如果您对任何其他API有任何建议,请告诉我们。
感谢。
答案 0 :(得分:2)
您可以生成一个worker池,而不是累积文件系统事件 从公共队列获取任务的线程。看门狗线程然后可以放 发生文件系统事件时队列中的任务。这样做,一个工人线程 可以在事件发生后立即开始工作。
例如,
import logging
import Queue
import threading
import time
import watchdog.observers as observers
import watchdog.events as events
logger = logging.getLogger(__name__)
SENTINEL = None
class MyEventHandler(events.FileSystemEventHandler):
def on_any_event(self, event):
super(MyEventHandler, self).on_any_event(event)
queue.put(event)
def __init__(self, queue):
self.queue = queue
def process(queue):
while True:
event = queue.get()
logger.info(event)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,
format='[%(asctime)s %(threadName)s] %(message)s',
datefmt='%H:%M:%S')
queue = Queue.Queue()
num_workers = 4
pool = [threading.Thread(target=process, args=(queue,)) for i in range(num_workers)]
for t in pool:
t.daemon = True
t.start()
event_handler = MyEventHandler(queue)
observer = observers.Observer()
observer.schedule(
event_handler,
path='/tmp/testdir',
recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
运行
% mkdir /tmp/testdir
% script.py
产生类似
的输出[14:48:31 Thread-1] <FileCreatedEvent: src_path=/tmp/testdir/.#foo>
[14:48:32 Thread-2] <FileModifiedEvent: src_path=/tmp/testdir/foo>
[14:48:32 Thread-3] <FileModifiedEvent: src_path=/tmp/testdir/foo>
[14:48:32 Thread-4] <FileDeletedEvent: src_path=/tmp/testdir/.#foo>
[14:48:42 Thread-1] <FileDeletedEvent: src_path=/tmp/testdir/foo>
[14:48:47 Thread-2] <FileCreatedEvent: src_path=/tmp/testdir/.#bar>
[14:48:49 Thread-4] <FileCreatedEvent: src_path=/tmp/testdir/bar>
[14:48:49 Thread-4] <FileModifiedEvent: src_path=/tmp/testdir/bar>
[14:48:49 Thread-1] <FileDeletedEvent: src_path=/tmp/testdir/.#bar>
[14:48:54 Thread-2] <FileDeletedEvent: src_path=/tmp/testdir/bar>
Doug Hellman编写了一套优秀的教程(现已编辑成a book),可以帮助您入门:
我实际上并没有像所讨论的那样使用多处理池或ThreadPool 在最后两个链接中,但无论如何你可能会觉得它们很有用。