赞
踩
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
这是官网的示例。
Pool(5)
中的5指的是要开的进程数。
p.map()
的用法就是, 输入两个参数, 第一个参数是你要执行的函数, 第二个参数则是需要被执行的参数列表。 p.map()
将负责把列表中的元素一个个作为要执行函数的输入参数,执行函数。
上述代码的输出结果为: [1,4,9]
。 即.map()
函数的返回值就是将每个元素输入执行函数后的返回值用列表的形式, 返回这个列表。
注意,尽管你需要遍历的参数列表可能被分配到了多个进程中同时运行,但p.map()
函数会非常智能地仍按照你参数列表的顺序, 输出对应的结果。 (所以你不会得到[1, 9, 4]
这样的乱序结果)。
使用多进程的时候, 往往也想知道代码的运行进度, 还需要多久。
python里最简便的进度条监视库就是tqdm了。
然而直接使用tqdm往往只能监测单进程, 多进程时就不行了。
这时候,就该表演真正的技术了!
例子:
from multiprocessing import Pool
from tqdm import tqdm
def f(x):
return x * x
if __name__ == '__main__':
with Pool(5) as p:
print(list((tqdm(p.imap(f, range(10)), total=10, desc='监视进度'))))
输出结果为:
监视进度: 100%|██████████| 10/10 [00:00<00:00, 43.03it/s]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
就实现了和单进程里一样的监视效果, 极为实用!
其中, 要将.map()
方法修改为.imap()
方法,然后total参数代表总数目,desc里面可以加入文字。
建议大家用.map()
方法开启多进程加速代码, 把对每一个元素要进行的操作写成一个函数, 再把要遍历的所有元素放入一个列表来传输, 返回值得到一个列表, 非常方便。
需要用tqdm监视时, 将p.map()
改为p.imap()
。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。