我正在使用Python的Watchdog监控某个目录以检测新文件的创建。当创建一个文件时,会运行一些代码,生成一个子进程shell命令来运行不同的代码以处理此文件。这应该运行每个新创建的文件。我已经测试过了,当一个文件被创建时,一切正常,但是在多个文件同时或接连被创建时,我遇到了麻烦。
我的当前问题是... shell中运行的处理代码需要一段时间才能运行,而且在目录中创建新文件之前不会完成。我无能为力解决它。当这段代码正在运行时,Watchdog将无法识别是否已创建新文件,并且将无法继续执行代码。所以我认为我需要为每个新文件生成一个新进程,或者做一些并行处理的事情,而不是等待一个文件完成后再处理下一个文件。
因此我的问题是:
在上述内容中,我的监视方法设置了看门狗来监视主目录。MonitorFiles类定义了文件创建时发生的操作。它基本上调用了dosWatch.go方法,最终调用了subprocess.Popen来运行一个shell命令。
我的当前问题是... shell中运行的处理代码需要一段时间才能运行,而且在目录中创建新文件之前不会完成。我无能为力解决它。当这段代码正在运行时,Watchdog将无法识别是否已创建新文件,并且将无法继续执行代码。所以我认为我需要为每个新文件生成一个新进程,或者做一些并行处理的事情,而不是等待一个文件完成后再处理下一个文件。
因此我的问题是:
1.) 实际上,我会有4个文件,分别在同一个目录下的不同系列中同时创建。最好的方法是如何让watchdog一次性对所有4个文件的创建运行代码?
2.) 当代码正在处理一个文件时,如何让watchdog开始处理同一系列中的下一个文件,而不必等待前一个文件的处理完成。这是必要的,因为文件很特殊,我需要暂停一个文件的处理,直到另一个文件完成,但它们被创建的顺序可能会有所不同。
我需要将我的watchdog与多进程或线程结合起来吗?还是我需要实现多个观察者?我有点茫然。谢谢任何帮助。
class MonitorFiles(FileSystemEventHandler):
'''Sub-class of watchdog event handler'''
def __init__(self, config=None, log=None):
self.log = log
self.config = config
def on_created(self, event):
file = os.path.basename(event.src_path)
self.log.info('Created file {0}'.format(event.src_path))
dosWatch.go(event.src_path, self.config, self.log)
def on_modified(self, event):
file = os.path.basename(event.src_path)
ext = os.path.splitext(file)[1]
if ext == '.fits':
self.log.warning('Modifying a FITS file is not allowed')
return
def on_deleted(self, event):
self.log.critical('Nothing should ever be deleted from here!')
return
主要监控
def monitor(config, log):
'''Uses the Watchdog package to monitor the data directory for new files.
See the MonitorFiles class in dosClasses for actual monitoring code'''
event_handler = dosclass.MonitorFiles(config, log)
# add logging the the event handler
log_handler = LoggingEventHandler()
# set up observer
observer = Observer()
observer.schedule(event_handler, path=config.fitsDir, recursive=False)
observer.schedule(log_handler, config.fitsDir, recursive=False)
observer.start()
log.info('Begin MaNGA DOS!')
log.info('Start watching directory {0} for new files ...'.format(config.fitsDir))
# monitor
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.unschedule_all()
observer.stop()
log.info('Stop watching directory ...')
log.info('End MaNGA DOS!')
log.info('--------------------------')
log.info('')
observer.join()
在上述内容中,我的监视方法设置了看门狗来监视主目录。MonitorFiles类定义了文件创建时发生的操作。它基本上调用了dosWatch.go方法,最终调用了subprocess.Popen来运行一个shell命令。
watchdog
内部,有一个线程调用您的FileSystemEventHandler
对象。所以,是的,您是正确的,在这个线程中按顺序调用on_*
方法。如果您想在完成工作之前接收下一个事件,则需要生成一个线程并立即从on_created
返回。确保dosWatch.go
真的没有阻塞on_created
。 - gwohpq9