Jupyter Notebook下starmap并行进程内部tqdm进度条不显示问题
问题原因
Jupyter Notebook 的前端输出上下文仅对主进程生效,通过 multiprocessing 创建的子进程无法直接向前端发送渲染 tqdm.notebook 进度条的请求,因此直接在子进程内调用 tqdm 不会产生任何显示。
可行解决方案
通过多进程共享队列转发进度更新信号,所有进度条的渲染逻辑统一放在主进程执行,即可实现每个进程对应独立进度条的效果,完整可运行代码如下:
from time import sleep import multiprocessing from threading import Thread from tqdm.notebook import tqdm # 子进程执行的任务逻辑 def product_(task_id, a, b, queue): total_step = 10 for _ in range(total_step): sleep(0.1) # 向队列发送进度更新信号:(任务ID, 更新步长) queue.put((task_id, 1)) # 任务结束发送终止信号 queue.put((task_id, None)) return a * b # 主进程监听队列更新进度条 def progress_watcher(queue, pbar_map): while True: task_id, update_val = queue.get() if update_val is None: pbar_map[task_id].close() # 所有任务完成后退出监听 if all(pbar.disable for pbar in pbar_map.values()): break else: pbar_map[task_id].update(update_val) if __name__ == "__main__": # 自定义任务列表 task_list = [(1, 2), (3, 4)] task_count = len(task_list) with multiprocessing.Manager() as manager: # 初始化共享队列和进度条映射 progress_queue = manager.Queue() pbar_map = { idx: tqdm(total=10, desc=f"进程{idx}") for idx in range(task_count) } # 启动进度监听线程 watcher_thread = Thread(target=progress_watcher, args=(progress_queue, pbar_map)) watcher_thread.start() # 启动进程池执行任务 with multiprocessing.Pool(processes=2) as pool: args_list = [ (idx, a, b, progress_queue) for idx, (a, b) in enumerate(task_list) ] results = pool.starmap(product_, args_list) # 等待监听线程退出 watcher_thread.join() print("所有任务执行结果:", results)
说明
- 所有进度条的创建、更新、关闭逻辑都在Jupyter主进程内完成,完全适配Notebook的前端交互规则
- 每个任务对应独立的进度条,支持自定义描述、总长度等参数
- 不需要额外安装第三方依赖,仅用Python原生库和tqdm即可实现
内容的提问来源于stack exchange,提问作者Eudald
相关产品推荐
相关产品推荐

