[英]Showing tqdm progress bar while using Python multiprocessing
我正在尝试使用 Python 的multiprocessing
库运行一些计算量很大的任务,并且我想为每个工作人员显示一个 tqdm 进度条。 具体来说,我希望为multiprocessing.Process
工作人员或multiprocessing.Pool
工作人员提供此功能。
我知道有关此主题的类似 StackOverflow 问题(参见例如(1) 多处理:使用 tqdm 显示进度条,(2) 显示 Python 多处理池 imap_unordered 调用的进度? ,(3) tqdm 进度条和多处理) 但他们似乎都对在所有工作人员中显示一个进度条感兴趣。 我想为每个工人显示一个进度条。
这是一个示例 function,代替了我计算量大的 function 我想多进程:
from tqdm import notebook
import time
def foo2(id):
total = 100
with notebook.tqdm(total=total, position=id) as pbar:
for _ in range(0, total, 5):
pbar.update(5)
time.sleep(0.1)
当我依次尝试时,我得到了预期的结果:5 个进度条一个接一个地填满。
但是,当我尝试使用multiprocessing
执行此操作时,我得到了所需的加速,但没有显示进度条。 无论我使用Pool
工作人员还是Process
工作人员,这都是正确的。 这是我的示例代码:
%%time
from multiprocessing import Pool
pool = Pool(5)
pool.map(foo2, range(5))
pool.close()
pool.join()
根据这里的评论( https://github.com/tqdm/tqdm/issues/407#issuecomment-322932800 ),我尝试使用几个ThreadPool
工作人员,奇怪的是这能够产生进度条。 但是,对于我的情况,我更喜欢使用带有进度条的Pool
或Process
工作人员。
%%time
from multiprocessing.pool import ThreadPool
pool = ThreadPool(5)
pool.map(foo2, range(5))
pool.close()
pool.join()
希望有人可以帮助我。 我已经尝试了几乎所有我能想到的东西。 作为参考,我使用的是 Python 3.7.7
和 tq 4.57.0
。
在 github 主页面上搜索tqdm
的问题帖子,我发现了一个对我有用的黑客,但它绝对感觉像是一个“黑客”而不是真正的问题修复: https://github.com/tqdm/tqdm/issues /485#issuecomment-473338308
新的(工作)代码如下所示:
from tqdm import notebook
import time
def foo2(id):
total = 100
print(' ', end='', flush=True)
for _ in notebook.tqdm(range(0, total, 5)):
time.sleep(0.1)
加
%%time
pool = Pool(5)
#pool.map(foo2, range(5)) # this also works fine with the new hack
for i in range(5):
pool.apply_async(foo2, args=(i,))
pool.close()
pool.join()
我不知道这个问题是否仍然相关,但您可以使用parallelbar库轻松完成。 这是一个简单的例子
#pip install parallelbar
from parallelbar import progress_map
from math import radians, sin, cos
# toys example of computationally expensive function
def cpu_bench(number):
product = 1.0
for elem in range(number):
angle = radians(elem)
product *= sin(angle)**2 + cos(angle)**2
return product
if __name__=='__main__':
tasks = [1000000 + i for i in range(100)]
result = progress_map(cpu_bench, tasks, n_cpu=4, chunk_size=1, core_progress=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.