问题描述
我有一个看门狗脚本来递归监视目录。发生事件时,我想对文件进行处理。
这工作得很好,但是某些文件非常大,因此对该文件的处理阻止了观察程序,后来又丢失了一些文件,因为观察程序由于阻止而无法识别它们。
所以我认为multiprocessing
会有所帮助。我的想法是,该事件(创建,修改,...)将启动一个新进程,然后执行该功能。
我现在有一个示例脚本,将watchdog
与multiprocessing
结合在一起,但是我很难使其正常工作。
import os
import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
from multiprocessing import Process
def print_msg(text):
proc = os.getpid()
print("{0} über Prozess ID: {1}".format(text,proc))
def on_created(event):
text = "hey,{0} has been created!".format(event.src_path)
proc = Process(target=print_msg,args=(text))
proc.start()
proc.join()
def on_deleted(event):
text = "what the f**k! Someone deleted {0}!".format(event.src_path)
proc = Process(target=print_msg,args=(text))
proc.start()
proc.join()
def on_modified(event):
text = "hey buddy,{0} has been modified".format(event.src_path)
proc = Process(target=print_msg,args=(text))
proc.start()
proc.join()
def on_moved(event):
text = "ok ok ok,someone moved {0} to {1}".format(event.src_path,event.dest_path)
proc = Process(target=print_msg,args=(text))
proc.start()
proc.join()
if __name__ == "__main__":
patterns = "*"
ignore_patterns = ""
ignore_directories = False
case_sensitive = True
my_event_handler = PatternMatchingEventHandler(patterns,ignore_patterns,ignore_directories,case_sensitive)
my_event_handler.on_created = on_created
my_event_handler.on_deleted = on_deleted
my_event_handler.on_modified = on_modified
my_event_handler.on_moved = on_moved
path = "\\\swibinacl01-cifs\\BelVis\\PROD\\Importer\\Messdaten"
go_recursively = True
my_observer = Observer()
my_observer.schedule(my_event_handler,path,recursive=go_recursively)
my_observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
my_observer.stop()
my_observer.join()
当我测试脚本时,仅在第一个事件出现时,我会收到以下消息:
my_event_handler.on_created = on_created
NameError: name 'my_event_handler' is not defined
所以我认为在事件(或开始新过程)之后,my_event_handler
对象已经消失,需要重新初始化。
那为什么呢?我的想法是,当事件在新流程中启动功能时,原始流程(观察者)将继续运行,并且新流程独立运行。
我怎么了有人可以帮我吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)