我没有使用 Python Watchdog,但从通用实时系统的角度来看,
- 处理 xml
_validate_xml
可能会很慢,并且会让您错过事件。
- event = 类似于中断,处理应该尽可能快。
如果您在处理事件时做的越多,您的系统就会变得越不“实时”。您可以做的是将 xml 有效性检查卸载到另一个进程并与Queue
(消息将是event.dest_path
)您看到移动的路径交换消息。您的事件处理将像将消息放入队列一样简单,并且队列的使用者可以批量处理文件。
简而言之:
- 实例化一个
Queue
fork()
过程
- 在
on_moved
处理程序中,将消息放入队列中,
- 在分叉的进程中,从队列中弹出消息并调用
_validate_xml
.
- 您可以选择
multiprocessing.Pool
并行利用 do validate xml 文件。
祝你好运。
编辑:在我的系统上测试;上面的大多数评论似乎都不适用,因为看门狗的代码似乎处理threading
得很好。
#!/usr/bin/env python
import time
from watchdog.observers import Observer, api
from watchdog.events import LoggingEventHandler, FileSystemEventHandler, FileMovedEvent
import logging
def counter_gen():
count = 0
while True:
count += 1
yield count
class XmlValidatorHandler(FileSystemEventHandler):
sleep_time = 0.1
COUNTER = counter_gen()
def on_moved(self, event):
if isinstance(event, FileMovedEvent):
print '%s - event %d; validate: %s' % (
type(self).__name__, self.COUNTER.next(), event.dest_path)
time.sleep(self.sleep_time)
class SlowXmlValidatorHandler(XmlValidatorHandler):
sleep_time = 2
COUNTER = counter_gen()
def get_observer(handler):
observer = Observer(timeout=0.5)
observer.event_queue.maxsize=10
observer.schedule(handler, path='.', recursive=True)
return observer
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
event_handler = LoggingEventHandler()
observer1 = get_observer(XmlValidatorHandler())
observer2 = get_observer(SlowXmlValidatorHandler())
observer1.start()
observer2.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer1.stop()
observer2.stop()
observer1.join()
observer2.join()
无法重现您的问题。一些指示:
- 检查队列
maxsize
,如果您那里已经有物品并且没有及时处理,那么我的猜测是timeout
踢进去并且event
丢失了。在这种情况下,您可能需要调整大小。
- 检查
timeout
,如果已配置,您可能需要调整该参数。
也许更完整的片段会帮助我们帮助您。