进程池Pool的imap方法解析

Python015

进程池Pool的imap方法解析,第1张

Python中,multiprocessing库中Pool类代表进程池,其对象有imap()和imap_unordered()方法。

两者都用于对大量数据遍历多进程计算,返回一个迭代器(multiprocessing.pool.IMapIterator)。

imap返回结果顺序和输入相同,imap_unordered则为不保证顺序。

经过测试,发现Python多进程和imap()的一些特性:

1、 iter = pool.imap(fn, data) 一旦生成,无论使不使用iter,多进程计算都会开始。

计算结果会缓存在内存中,所以要注意内存用尽的问题。

2、fn,即执行函数,不可以是局部对象(不能嵌套在其他函数里),否则会报错:

AttributeError: Can't pickle local object 'fn_outer.<locals>.fn'

3、使用进程池map数据时,如果每次的运算量很小,最后的效率还不如单进程。这时多进程切换造成的开销已大于多进程计算提升的效率。

这时,可以将输入数据集分段,每次map,计算一段。具体分段多大时获得最佳效率,需要实际测试。

4、注意,Pool使用完毕后必须关闭,否则进程不会退出。

有两种写法,推荐第2种:

注意 ,第二种中,必须在with的块内使用iter。

第一个进程的时候你建文件的时候用os.open(‘your_lockfile’,os.O_CREAT|os.O_EXCL|os.O_RDWR) 第二个进程里你先看这个文件有没有,如果有就try删除它,然后except OSError as e,如果e.errno==13就说明有第一个进程在运行。

因为进程池一次只能运行4个进程,0,1,2,3是四个进程同时执行,那么4只能等待。当进程池中任意一个进程结束后,4立即执行,所以在0结束后4开始执行,接着1,2,3陆续结束,4最后结束。