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

使用joblib Parallel时如何实现4个独立更新的tqdm进度条?

解决joblib并行时tqdm进度条重叠的问题

当然可以实现4个独立更新的进度条!你遇到的重叠问题本质上是因为每个并行子任务里的tqdm默认都抢占同一个输出位置(position=0),导致它们的输出互相覆盖。下面给你两种实用的解决方案:

方法一:给每个子任务分配唯一的进度条位置

这个方法最直接,通过给每个并行任务的tqdm指定不同的position参数,让它们在终端里占据独立的行。

步骤1:修改你的函数,接收position参数

首先更新func,让它能接收进度条的位置参数:

from tqdm import tqdm

def func(something, position):
    # 给tqdm指定唯一的position,leave=True会让进度条完成后保留在终端
    for j in tqdm(something, position=position, leave=True):
        # 你的原有业务逻辑
        ...

步骤2:调用时传递位置索引

在使用joblib.Parallel时,通过enumerate给每个任务分配唯一的位置索引:

from joblib import Parallel, delayed

something_else = [...]  # 你的任务列表

# 并行执行,每个任务对应一个独立的进度条位置
Parallel(n_jobs=4)(
    delayed(func)(s, pos) 
    for pos, s in enumerate(something_else)
)

注意事项:

  • 如果你的任务数量远大于n_jobs(比如4个进程处理100个任务),设置leave=False可以让完成的进度条自动清除,避免终端被大量已完成的进度条占满。
  • 确保position的数值不要超过你的终端行数,否则进度条会超出可视范围。

方法二:使用tqdm的进程安全锁+自定义描述

如果不想管理位置参数,也可以给每个进度条添加唯一的描述(比如任务ID),并启用tqdm的进程安全锁,避免输出错乱:

修改后的函数和调用方式

from tqdm import tqdm
from joblib import Parallel, delayed
import multiprocessing

# 创建一个进程安全的锁
lock = multiprocessing.Lock()

def func(something, task_id):
    # 添加唯一描述,并用lock保证输出不交错
    for j in tqdm(something, desc=f"Task {task_id}", lock=lock):
        # 你的原有业务逻辑
        ...

something_else = [...]  # 你的任务列表

Parallel(n_jobs=4)(
    delayed(func)(s, task_id) 
    for task_id, s in enumerate(something_else)
)

这种方式下,每个进度条会带有独特的任务标识,即使输出偶尔有小交错,也能清晰区分每个任务的进度,而且不需要手动管理位置。

内容的提问来源于stack exchange,提问作者Abhishek Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:16:14