python watchdog检测到文件产生,动态创建进程,不指定进程数去处理,处理过程中需要写文件,同时产生多个文件的话会同时创建多个进程去处理,怎么保存写文件不冲突

如果希望在检测到文件时动态创建进程而不预先指定进程数,并确保写文件时不发生冲突,可以使用队列和锁的机制。以下是一个改进的方案:

python

from multiprocessing import Process, Queue, Lock
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import sys

class FileProcessor(Process):
    def __init__(self, queue, lock):
        super().__init__()
        self.queue = queue
        self.lock = lock

    def run(self):
        while True:
            path = self.queue.get()
            if path is None:  # 接收到结束信号
                self.queue.task_done()
                break
            
            # 假设的文件处理逻辑
            result = f"Processed content of {path}"
            
            with self.lock:
                with open(f"{path}.processed", "w") as f:
                    f.write(result)
            self.queue.task_done()

class MyHandler(FileSystemEventHandler):
    def __init__(self, queue):
        self.queue = queue

    def on_created(self, event):
        if event.is_directory:
            return
        self.queue.put(event.src_path)

def main():
    manager = Manager()
    queue = manager.Queue()
    lock = manager.Lock()
    
    observer = Observer()
    observer.schedule(MyHandler(queue), path='./watchdir', recursive=False)
    observer.start()
    
    try:
        while True:
            # 动态创建进程,但需考虑上限,这里简单示例,实际情况可能需要更复杂的管理逻辑
            if queue.qsize() > 0 and len(active_processes) < MAX_PROCESSES:
                p = FileProcessor(queue, lock)
                p.start()
                active_processes.append(p)
            time.sleep(1)  # 防止过于频繁的检查,可根据需要调整
    except KeyboardInterrupt:
        observer.stop()
        print("Stopping...")
    
    # 清理和结束进程
    for _ in active_processes:
        queue.put(None)  # 发送结束信号
    observer.join()
    for p in active_processes:
        p.join()

if __name__ == "__main__":
    MAX_PROCESSES = 5  # 最大同时运行的进程数,根据实际情况调整
    active_processes = []  # 用于追踪活动的进程
    main()

我们定义了一个FileProcessor类继承自Process,这样每个处理任务都在一个独立的进程中运行。在MyHandler检测到文件创建时,将文件路径加入队列。主程序会检查队列大小以及当前活跃进程的数量,如果队列中有待处理的任务且活跃进程数未达到预设的最大值(例如MAX_PROCESSES),则创建新的FileProcessor进程。每个FileProcessor在完成任务或接收到结束信号后会自动结束,同时使用锁来保护写文件操作,防止冲突。
请注意,虽然这个方案允许动态创建进程,但实际应用中应当考虑设置合理的最大进程数限制,以避免因资源耗尽导致的系统不稳定。此外,还需要考虑如何优雅地管理和结束这些动态创建的进程,尤其是在程序退出时。

Watchdog是一个Python库,用于监控文件系统的变化,包括新文件、修改的文件以及删除的文件。如果你想监控多个文件路径下的新增文件并将文件保存到Excel,可以按照以下步骤操作: 1. 首先安装必要的库,如`watchdog`, `openpyxl`(用于处理Excel文件)和`pathlib`(处理文件路径): ```bash pip install watchdog openpyxl pathlib ``` 2. 使用`watchdog`创建一个事件处理器,这个处理检测文件变化时触发: ```python import time from pathlib import Path from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from openpyxl import Workbook class FileHandler(FileSystemEventHandler): def __init__(self): self.workbook = Workbook() self.worksheet = self.workbook.active self.worksheet.append(['File Name']) def on_created(self, event): if event.is_directory: return file_path = Path(event.src_path) file_name = file_path.name self.worksheet.append([file_name]) def save_to_excel(self): file_name = "file_monitor.xlsx" self.workbook.save(file_name) # 初始化并开始监听 handler = FileHandler() observer = Observer() observer.schedule(handler, paths_to_watch, recursive=True) observer.start() try: while True: time.sleep(1) # 每秒检查一次,可根据需求调整时间间隔 except KeyboardInterrupt: observer.stop() observer.join() handler.save_to_excel() # 当程序退出时,保存文件信息到Excel ``` 在这个例子,你需要将`paths_to_watch`替换为你想要监控的具体文件夹路径列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值