Python 3中的多进程看门狗脚本问题

问题描述

我有一个看门狗脚本来递归监视目录。发生事件时,我想对文件进行处理。

这工作得很好,但是某些文件非常大,因此对该文件的处理阻止了观察程序,后来又丢失了一些文件,因为观察程序由于阻止而无法识别它们。

所以我认为multiprocessing会有所帮助。我的想法是,该事件(创建,修改,...)将启动一个新进程,然后执行功能

我现在有一个示例脚本,将watchdogmultiprocessing结合在一起,但是我很难使其正常工作。

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 (将#修改为@)