繁体   English   中英

多线程时如何防止 tqdm 在换行符中打印进度条?

[英]How to prevent tqdm from printing progress bar in newline while multithreading?

我在搞乱 tqdm 模块并想同时运行进度条,所以我制作了 Thread 对象如下

from tqdm import tqdm
import time
from threading import Thread

def func1():
    for i in tqdm(range(20)):
        time.sleep(0.1)

def func2():
    for j in tqdm(range(20)):
        time.sleep(0.3)

t1 = Thread(target=func1)
t2 = Thread(target=func2)

t1.start()
t2.start()

t2.join()
t1.join()

print('Completed')

output 开头起始输出

但是当线程 t2 结束时,它与 t1 的条形显示交换 position 并且 t1 一直运行到它结束。

我不希望酒吧交换位置

我尝试交换线程开始和连接线的位置,但是一旦 t2 像这样完成,它会导致重新打印 t1 bar 混乱的输出

要分析这些问题,我建议您自己尝试运行这些代码。

有人能告诉我为什么会发生这两件事以及如何解决吗?

一种解决方案可能是在单独的线程中更新所有条(使用Queue获取下一个应该更新的条):

import time
import queue
from tqdm import tqdm
from threading import Thread

bars_queue = queue.Queue()


def func1():
    for i in range(20):
        bars_queue.put_nowait(0)  # update bar 0
        time.sleep(0.1)


def func2():
    for j in range(20):
        bars_queue.put_nowait(1)  # update bar 1
        time.sleep(0.3)


def bars_handler():
    bars = [tqdm(total=20, position=i) for i in range(2)]
    while True:
        i = bars_queue.get()  # which bar should I update next?
        bars[i].update()
        bars[i].refresh()


bars_thread = Thread(target=bars_handler, daemon=True) # daemon=True so we don't have to use .join()
bars_thread.start()

t1 = Thread(target=func1)
t2 = Thread(target=func2)

t1.start()
t2.start()

t2.join()
t1.join()

print("{}Completed".format("\n" * 2))

正确打印条:

100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:01<00:00, 10.09it/s]
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:05<00:00,  3.33it/s]
Completed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM