尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

多进程运行代码模板

多进程运行代码模板
📅 发布时间:2026/6/19 11:29:00
import os
import json
import random
import glob
import multiprocessing as mp
from collections import defaultdict
from tqdm import tqdm# 配置变量:修改这些值来适应不同任务
MAX_BARS = 3  # 可见进度条的最大数量
RESUME_COUNTS_DIR = "/path/to/resume"  # 恢复计数器的目录路径def safe_print(msg: str):tqdm.write(msg)  # 与tqdm兼容的打印def process_item(item, proc_idx, state):"""在这里实现每个任务的工作逻辑。`item` 是任务项。`state` 可以保存每个进程的缓存、计数器等。"""# ... 执行实际工作 ...state["count"] += 1return f"done-{item}"def worker(proc_idx, tasks):touched_dirs = set()counters = defaultdict(int)resume_counts_path=os.path.join(RESUME_COUNTS_DIR, f"file_select_counts_p{proc_idx}.json")# 如果需要恢复,则加载每个进程的计数器if resume_counts_path and os.path.exists(resume_counts_path):try:with open(resume_counts_path, "r", encoding="utf-8") as f:counters.update(json.load(f))except Exception as e:safe_print(f"进程 {proc_idx} 加载计数器失败: {e}")show_bar = proc_idx < MAX_BARSiterator = tqdm(tasks,desc=f"进程 {proc_idx}",unit="task",position=proc_idx if show_bar else 0, # 仅前 N 个占用独立行disable=not show_bar, # 其他进程隐藏进度条leave=True, # 进度条在完成后会保留在终端中,而不是被清除掉ncols=100, # 设置进度条的总宽度为 100 个字符,确保在终端中显示得更整齐)for task_id, item in iterator:process_item(item, proc_idx, counters)if resume_counts_path:with open(resume_counts_path, "w", encoding="utf-8") as f:json.dump(dict(counters), f, indent=2, ensure_ascii=False)return list(touched_dirs)def distribute_tasks(items, num_procs):"""示例:随机抽取与轮询分配相结合的任务分配。根据需要替换为其他分片方式(轮询、块分割、工作窃取等)。"""total_cnt = ...buckets = [[] for _ in range(num_procs)]for i in range(total_cnt):item = random.choices(items, k=1)[0]proc = i % num_procsbuckets[proc].append((i, item))return bucketsdef merge_outputs(dir_list):"""后处理合并每个进程的分片;根据输出布局调整。"""passdef main(root_dir, num_procs):# 发现工作项items = [...]  # 填充你的项列表if not items:safe_print("未找到项。")returnnum_procs = max(1, num_procs)tasks_per_proc = distribute_tasks(items, num_procs)with mp.Pool(processes=num_procs) as pool:results = pool.starmap(worker,[(idx,tasks,)for idx, tasks in enumerate(tasks_per_proc)],)all_dirs = [d for sub in results for d in sub]merge_outputs(all_dirs)if __name__ == "__main__":import sysif len(sys.argv) != 3:safe_print("Usage: python script.py <directory> <num_processes>")sys.exit(1)root_dir = sys.argv[1]num_processes = int(sys.argv[2])main(root_dir, num_processes)

注意事项

  • 多进程代码比较重要的事情:
    • 有恢复功能:上面的代码实现了resume_counts_path
    • 每个进程之间产生的文件不冲突:上面的代码让每个进程并行运行,产生的文件都附带了进程号(比如file_select_counts_p{proc_idx}.json),最后可以通过一个函数合并
  • with mp.Pool(processes=num_procs) as pool:同时启动了num_procs个worker函数
    • 每个worker函数处理一个(idx, tasks)元组
    • 应该保证tasks_per_proc的长度与num_procs相同
    • results是一个列表,长度为num_procs,每个元素是每个worker的返回结果

相关新闻

  • 深入解析:长沙理工《人工智能基础A》实验(上机)报告实验三 电商数据可视化/图像处理
  • AI 编程目录索引
  • 2025具有规模的双卡压式碳钢消防管TOP5权威推荐,甄选靠

最新新闻

  • 面试被问“你的缺点是什么”,90%的应届生都答错了!(附满分话术)
  • Spring Cloud Alibaba 最佳实践:基于 Spring Boot 4.0 的完整微服务示例项目
  • 三步掌握AI斗地主:如何用DouZero智能助手提升你的游戏胜率
  • 2026山东大学项目实训个人博客(六)
  • DC/DC电源设计实战:从MIC261201选型到PCB布局与热管理全解析
  • 2026济南婚纱摄影选型全指南:行业标准、品牌梯队与合规避坑全解析 - 速递信息

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号