[英]Unexpected output when running tqdm inside multiprocessing.Process
我试图为我的程序中的每个线程显示一个单独的进度条,尽管我也可以使用一个显示总体总进度的进度条。 这是代码:
def cluster(indexes, process_n):
for index in tqdm(indexes, position=process_n, nrows=N_CORES + 1, desc='Process ' + str(process_n)):
# Do something
和
process = multiprocessing.Process(target=cluster, args=(indexes, process_n))
process.start()
processes.append(process)
for process in processes:
process.join()
但是,我似乎在函数运行时打印了额外的静态进度条。 当我只运行一个线程(因此只有一个进度条)时不会发生这种情况。因为我打算在 32 个线程上运行这段代码,所以输出变得非常混乱。 以下是运行 8 个线程时的终端输出示例:
Process 1: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:09<00:00, 13.86it/s]
Process 0: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:09<00:00, 13.25it/s]
Process 7: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:10<00:00, 12.54it/s]
Process 6: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:10<00:00, 12.54it/s]
Process 2: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:10<00:00, 12.50it/s]
Process 5: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:10<00:00, 12.43it/s]
Process 4: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:10<00:00, 12.40it/s]
Process 3: 100%|███████████████████████████████████████████████████████████████████████████████| 127/127 [00:10<00:00, 12.17it/s]
Process 4: 98%|█████████████████████████████████████████████████████████████████████████████▏ | 124/127 [00:10<00:00, 15.24it/s]
Process 3: 99%|██████████████████████████████████████████████████████████████████████████████▍| 126/127 [00:10<00:00, 17.41it/s]
Process 6: 63%|██████████████████████████████████████████████████▍ | 80/127 [00:06<00:04, 11.72it/s]
请告诉我如何解决这个问题。 如果解决方案涉及使用 multiprocessing.Process 以外的其他东西,那么请链接一些示例代码,以便我了解它是如何工作的。 谢谢!
您可以手动管理您的tqdm
条并使用multiprocessing.Queue
来表示条应该更新。
此示例将创建 4 个执行工作的进程和一个通过队列更新条形的进程:
import random
from tqdm import tqdm
from time import sleep
import multiprocessing
N = 4
def cluster(indexes, n_proc, q):
for index in indexes:
# do some work
sleep(random.randint(1, 10) / 10)
# update progress bar:
q.put_nowait(n_proc)
def update_bar(q):
bars = [tqdm(total=10, position=i, desc=f"Process {i}") for i in range(N)]
while True:
n = q.get()
bars[n].update()
if __name__ == "__main__":
q = multiprocessing.Queue()
# daemon=True means the script doesn't wait for this process to end
process = multiprocessing.Process(target=update_bar, args=(q,), daemon=True)
process.start()
processes = []
for i in range(N):
process = multiprocessing.Process(
target=cluster, args=(range(10), i, q)
)
process.start()
processes.append(process)
for process in processes:
process.join()
print("\n" * N)
印刷:
Process 0: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:06<00:00, 1.50it/s]
Process 1: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:05<00:00, 1.71it/s]
Process 2: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:04<00:00, 1.63it/s]
Process 3: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:05<00:00, 1.97it/s]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.