问题
- 想使用多进程加速程序的处理,但是网上的很多入门例子都是只有一个参数的例子,很明显不符合要求
解决方案
- 看一下官方文档
- 上图中的参数为(fn, *args, **kwargs), args代表可以传入多个参数,**kargs代表可以传入字典作为参数,对于我个人来说,直接传入参数就可以了
例子
一
这是个trick的办法,将多个参数组成一个tuple,然后传给函数就行了,然后函数内部自己在解包赋值就行了
def job(x):
image = None
pid, url = x
# to do something
item_list = []
for 循环
item_list.append((pid, url))
executor = ProcessPoolExecutor(max_workers=12)
executor.map(job, item_list, chunksize=6)
二
def job(*x):
# 解包
pid, url = x
# to do something
# 将要处理的东西组成一个list,list中每一个条目都是job函数需要的参数
item_list = []
for 循环
item_list.append((pid, url))
# 出事化ProcessPoolExecutor,并且执行map函数
executor = ProcessPoolExecutor(max_workers=12)
executor.map(job, item_list, chunksize=6)
总结
- map的用法不太符合常规思路,根据有些人的说法,如果在队列中的某一个项目出现了异常,可能会导致程序崩掉。
- 建议是用submit方法,然后配合as_completed方法使用,效果更佳!
- 多进程或者多线程使用的函数一定要进行异常捕获操作,不然一个异常导致程序终止可就尴尬了