You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程查找指定文件夹:找到目标后终止所有进程

实现多进程查找目标文件夹后立即终止所有进程

要实现"任一进程找到目标后立刻终止所有其他进程"的需求,核心是通过进程间通信机制传递停止信号,同时在查找逻辑中加入信号检查。以下是具体修改方案:

关键修改思路

  • 使用multiprocessing.Event实现跨进程的信号通知,当某进程找到目标时触发该事件
  • 在所有查找逻辑中加入事件检查,一旦检测到停止信号就立即终止当前任务
  • 主进程监听事件状态,信号触发后主动终止所有未结束的进程,避免等待

修改后的完整代码

import os
from multiprocessing import Process, Event

def main():
    folder_name = "folder name"
    loc = r"given location"
    # 创建共享停止事件,用于跨进程传递停止信号
    stop_event = Event()
    # 获取分组后的完整目录路径列表(每组50个)
    dir_groups = get_all_dir(loc)
    
    processes = []
    for group in dir_groups:
        # 给每个进程传入停止事件对象
        proc = Process(target=search_group, args=(folder_name, group, stop_event))
        processes.append(proc)
        proc.start()
    
    # 等待停止事件触发,或所有进程自然结束
    while not stop_event.is_set():
        all_finished = all(not p.is_alive() for p in processes)
        if all_finished:
            break
    
    # 终止所有仍在运行的进程
    for proc in processes:
        if proc.is_alive():
            proc.terminate()
            proc.join()

def search_group(target_text, dir_group, stop_event):
    for dir_path in dir_group:
        # 每次处理目录前先检查是否需要停止
        if stop_event.is_set():
            break
        search_target_folder(target_text, dir_path, stop_event)

def search_target_folder(target_text, loc, stop_event):
    # 先检查停止信号,避免做无用功
    if stop_event.is_set():
        return
    
    found = {}
    for root, dirs, files in os.walk(loc, topdown=False):
        if stop_event.is_set():
            break
        for name in dirs:
            if stop_event.is_set():
                break
            name_lower = name.lower()
            # 过滤条件:排除含archive、$的文件夹,匹配目标名称
            if "archive" not in name_lower and "$" not in name_lower and target_text.lower() in name_lower:
                found[name] = os.path.join(root, name)
                # 触发停止信号,通知所有进程终止
                stop_event.set()
                break
    if found:
        print(f"找到目标文件夹:{found}")

def get_all_dir(loc):
    # 获取当前目录下所有子目录的完整路径
    all_dirs = [
        os.path.join(loc, d) 
        for d in os.listdir(loc) 
        if os.path.isdir(os.path.join(loc, d))
    ]
    # 按每组50个目录分组
    chunk_size = 50
    return [all_dirs[i:i+chunk_size] for i in range(0, len(all_dirs), chunk_size)]

if __name__== "__main__":
    main()

核心修改说明

  1. 共享事件stop_event:作为所有进程的全局停止信号,任一进程调用stop_event.set()后,其他进程都能通过stop_event.is_set()检测到停止指令。
  2. 分组逻辑优化:get_all_dir直接返回完整目录路径,避免后续函数重复拼接路径,减少出错概率。
  3. 实时信号检查:在search_group和search_target_folder的循环中加入信号检查,一旦收到停止指令就立即终止当前任务。
  4. 主进程主动终止:主进程不再等待所有进程join,而是监听事件状态,信号触发后直接终止剩余进程,大幅缩短停止响应时间。

内容的提问来源于stack exchange,提问作者rp-4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:45:01