私は Python Watchdog を使用していませんが、一般的なリアルタイム システムの観点から、
- xml の処理
_validate_xml
が遅くなる可能性があり、イベントを見逃す可能性があります。
- イベント = 割り込みと同様に、処理は可能な限り高速にする必要があります。
イベントの処理中に多くのことを行うほど、システムは「リアルタイム」ではなくなります。あなたができることは、xml の有効性チェックを別のプロセスにオフロードし、Queue
(メッセージはevent.dest_path
) とメッセージを交換することです。イベント処理はメッセージをキューに入れるのと同じくらい簡単で、ファイルはキューのコンシューマによってバッチで処理できます。
要するに:
- インスタンス化する
Queue
fork()
処理する
on_moved
ハンドラーで、メッセージをキューに入れ、
- フォークされたプロセスで、キューからメッセージをポップし、 を呼び出します
_validate_xml
。
- オプション
multiprocessing.Pool
で、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()
問題を再現できませんでした。いくつかのポインタ:
- check queue
maxsize
、すでにそこにアイテムがあり、それらがタイムリーに処理されない場合、私の推測では、timeout
キックが開始されてevent
失われます。その場合、サイズを変更することをお勧めします。
- 構成
timeout
されている場合は、そのパラメーターを調整することをお勧めします。
たぶん、より完全なスニペットがあなたを助けるのに役立つでしょう.