![](/img/trans.png)
[英]How to keep printing on the same line after the progress bar using 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')
但是当线程 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.