Python已传输所有文件时通知

时间:2014-10-04 17:02:49

标签: python-3.x filesystemwatcher python-watchdog

我正在使用"看门狗" api继续检查我的文件系统中的文件夹中的更改。无论该文件夹中的文件发生什么变化,我都会将它们传递给一个特定的函数,该函数为我传递的每个文件启动线程。

但看门狗或任何其他文件系统观察者api(据我所知),逐个文件通知用户,即当文件来时,他们会通知用户。但我希望它一次通知我一大堆文件,以便我可以将该列表传递给我的函数并使用多线程。目前,当我使用" watchdog"时,它一次通知我一个文件,我只能将那个文件传递给我的函数。我想一次传递许多文件,以便能够进行多线程处理。

我想到的一个解决方案是:你看到当你在一个文件夹中复制一堆文件时,操作系统会显示一个进度条。如果我可以在进度条完成时收到通知,那么这对我的问题来说是一个完美的解决方案。但我不知道这是否可能。

另外我知道看门狗是一个轮询API,而观看文件系统的理想API将是像pyinotify一样的中断驱动api。但我没有找到任何中断驱动的API,也没有跨平台。 iWatch很好,但仅适用于Linux,我想要所有操作系统的东西。因此,如果您对任何其他API有任何建议,请告诉我们。

感谢。

1 个答案:

答案 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 在最后两个链接中,但无论如何你可能会觉得它们很有用。