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()
核心修改说明
- 共享事件
stop_event:作为所有进程的全局停止信号,任一进程调用stop_event.set()后,其他进程都能通过stop_event.is_set()检测到停止指令。 - 分组逻辑优化:
get_all_dir直接返回完整目录路径,避免后续函数重复拼接路径,减少出错概率。 - 实时信号检查:在
search_group和search_target_folder的循环中加入信号检查,一旦收到停止指令就立即终止当前任务。 - 主进程主动终止:主进程不再等待所有进程
join,而是监听事件状态,信号触发后直接终止剩余进程,大幅缩短停止响应时间。
内容的提问来源于stack exchange,提问作者rp-4
相关产品推荐
相关产品推荐

