多处理:使用tqdm显示进度b

2024-04-29 20:03:59 发布

您现在位置:Python中文网/ 问答频道 /正文

为了使我的代码更加“pythonic”和更快,我使用“多处理”和一个map函数来发送它a)函数和b)迭代范围。

植入的解决方案(即,直接在范围tqdm上调用tqdm。tqdm(范围(0,30))不适用于多处理(如下面的代码中所述)。

进度条从0到100%显示(当python读取代码时?)但它并不表示map函数的实际进度。

如何显示进度条,指示“映射”功能在哪一步?

from multiprocessing import Pool
import tqdm
import time

def _foo(my_number):
   square = my_number * my_number
   time.sleep(1)
   return square 

if __name__ == '__main__':
   p = Pool(2)
   r = p.map(_foo, tqdm.tqdm(range(0, 30)))
   p.close()
   p.join()

欢迎任何帮助或建议。。。


Tags: 函数代码进度条importnumbermapfootime
3条回答

根据Xavi martinez的回答,我编写了函数imap_unordered_bar。它可以与imap_unordered以相同的方式使用,唯一的区别是显示了一个处理条。

from multiprocessing import Pool
import time
from tqdm import *

def imap_unordered_bar(func, args, n_processes = 2):
    p = Pool(n_processes)
    res_list = []
    with tqdm(total = len(args)) as pbar:
        for i, res in tqdm(enumerate(p.imap_unordered(func, args))):
            pbar.update()
            res_list.append(res)
    pbar.close()
    p.close()
    p.join()
    return res_list

def _foo(my_number):
    square = my_number * my_number
    time.sleep(1)
    return square 

if __name__ == '__main__':
    result = imap_unordered_bar(_foo, range(5))

解决方法:小心!由于多处理,估计时间(每个循环的迭代次数、总时间等)可能不稳定,但进度条工作得很好。

注意:池的上下文管理器仅在Python3.3版中可用

from multiprocessing import Pool
import time
from tqdm import *

def _foo(my_number):
   square = my_number * my_number
   time.sleep(1)
   return square 

if __name__ == '__main__':
    with Pool(processes=2) as p:
        max_ = 30
        with tqdm(total=max_) as pbar:
            for i, _ in tqdm(enumerate(p.imap_unordered(_foo, range(0, max_)))):
                pbar.update()

使用imap而不是map,后者返回已处理值的迭代器。

from multiprocessing import Pool
import tqdm
import time

def _foo(my_number):
   square = my_number * my_number
   time.sleep(1)
   return square 

if __name__ == '__main__':
   with Pool(2) as p:
      r = list(tqdm.tqdm(p.imap(_foo, range(30)), total=30))

相关问题 更多 >