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

Python多线程使用tqdm出现进度条重复显示问题如何解决

问题原因

  • Windows CMD终端对光标回退、行覆盖的ANSI转义序列支持不完善,多线程场景下多个tqdm实例同时向标准输出写内容时,输出流抢占会导致tqdm无法正确覆盖上一行的旧进度条,每次更新都会新起一行输出,最终出现大量重复的完成态进度条。
  • 未给不同线程的tqdm实例指定固定的显示位置,tqdm无法判断不同进度条的对应行,输出逻辑混乱。

修复方案

给每个线程的tqdm指定唯一的position参数固定显示行位置,同时传入全局共享的tqdm锁避免输出冲突,修改后的代码如下:

from time import sleep
from tqdm import tqdm
import threading

# 全局共享tqdm锁,避免多线程输出抢占
tqdm_lock = tqdm.get_lock()

def one():
    # position指定该进度条固定显示在第1行(从0开始计数)
    for i in tqdm(range(11), position=0, lock=tqdm_lock, desc="线程1"):
        sleep(1)
def two():
    # position指定该进度条固定显示在第2行
    for i in tqdm(range(11), position=1, lock=tqdm_lock, desc="线程2"):
        sleep(1)
def three():
    # position指定该进度条固定显示在第3行
    for i in tqdm(range(11), position=2, lock=tqdm_lock, desc="线程3"):
        sleep(1)

if __name__ == "__main__":
    t1 = threading.Thread(target=one)
    t2 = threading.Thread(target=two)
    t3 = threading.Thread(target=three)

    t1.start()
    t2.start()
    t3.start()

    t1.join()
    t2.join()
    t3.join()

如果调整后CMD下仍有显示异常,可以额外给每个tqdm加上ascii=True参数,用纯ASCII字符显示进度条,适配Windows终端的字符渲染逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:54:04