本文主要是介绍【Python】多进程运行含有任意个参数的函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
初始条件
from multiprocessing import Pooldef my_print(x, y):print(x + y)
1、处理方式
1.1 使用偏函数(partial)
偏函数有点像数学中的偏导数,可以让我们只关注其中的某一个变量而不考虑其他变量的影响。上面的例子中,Y始终等于1,那么我们在传入参数的时候,只需要考虑X的变化即可。例如你有一个函数,该函数有两个参数a,b,a是不同路径的下的图片的路径,b是输出的路径。很明显,a是一直在变化的,但是因为我们要将所有图片保存在同一个文件夹下,那么b很可能一直都没变。具体如下:
if __name__ == '__main__':# 多线程,多参数,partial版本x = [1, 2, 3, 4, 5]y = 1from functools import partialpartial_func = partial(my_print, y=y)pool = Pool()pool.map(partial_func, x)pool.close()pool.join()
1.2 使用可变参数
在Python函数中,函数可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,这就直接给我们提供了一种思路。具体如下:
def multi_wrapper(args):return my_print(*args)def my_print(x, y):print(x + y) if __name__ == "__main__": # 多线程,多参数,可变参数版本x = [1, 2, 3, 4, 5]y = [1, 1, 1, 1, 1]zip_args = list(zip(x, y))pool = Pool()pool.map(multi_wrapper, zip_args)pool.close()pool.join()
1.3 使用pathos提供的多进程库
from pathos.multiprocessing import ProcessingPool as newPoolif __name__ == '__main__':# 多线程,多参数,pathos版本x = [1, 2, 3, 4, 5]y = [1, 1, 1, 1, 1]pool = newPool()pool.map(my_print, x, y)pool.close()pool.join()
在该库的map函数下,可以看到,它允许多参数输入,其实也就是使用了可变参数:
def map(self, f, *args, **kwds):AbstractWorkerPool._AbstractWorkerPool__map(self, f, *args, **kwds)_pool = self._serve()return _pool.map(star(f), zip(*args)) # chunksize
1.4 使用starmap函数
if __name__ == '__main__': # 多线程,多参数,starmap版本x = [1, 2, 3, 4, 5]y = [1, 1, 1, 1, 1]zip_args = list(zip(x, y))pool = Pool()pool.starmap(my_print, zip_args)pool.close()pool.join()
3. 总结
其实在以上4种实现方法中 ,第1种方法的限制较多,如果该函数的其它参数都在变化的话,那么它就不能很好地工作,而剩下的方法从体验上来讲是依次递增的,它们都可以接受任意多参数的输入,但是第2种需要额外写一个函数,扣分;第3种方法需要额外安装pathos包,扣分;而最后一种方法不需要任何额外不择就可以完成,所以,推荐大家选择第4种方法!
这篇关于【Python】多进程运行含有任意个参数的函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!