具有不同功能的多进程池
大多数关于多进程工作池的例子都是在不同的进程中执行同一个函数,比如:
def foo(args):
pass
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=30)
res=pool.map_async(foo,args)
有没有办法在这个工作池中处理两个不同且独立的函数呢?比如说,你可以给foo()分配15个进程,给bar()也分配15个进程,还是说一个工作池只能绑定一个函数?或者说你必须手动为不同的函数创建不同的进程,使用
p = Process(target=foo, args=(whatever,))
q = Process(target=bar, args=(whatever,))
q.start()
p.start()
然后就不考虑工作池了?
6 个回答
9
这里是@Rayamon分享的想法的一个可行示例:
import functools
from multiprocessing import Pool
def a(param1, param2, param3):
return param1 + param2 + param3
def b(param1, param2):
return param1 + param2
def smap(f):
return f()
func1 = functools.partial(a, 1, 2, 3)
func2 = functools.partial(b, 1, 2)
pool = Pool(processes=2)
res = pool.map(smap, [func1, func2])
pool.close()
pool.join()
print(res)
12
你可以使用 map 函数或者一些简单的函数(编辑:其实你不能用简单的函数)。你可以用一个简单的 map 函数:
def smap(f, *args):
return f(*args)
pool = multiprocessing.Pool(processes=30)
res=pool.map(smap, function_list, args_list1, args_list2,...)
普通的 map 函数需要输入可迭代的对象,这样用起来就不太方便。
30
如果你想传递不同的函数,可以简单地多次调用 map_async
。
下面是一个例子来说明这一点:
from multiprocessing import Pool
from time import sleep
def square(x):
return x * x
def cube(y):
return y * y * y
pool = Pool(processes=20)
result_squares = pool.map_async(f, range(10))
result_cubes = pool.map_async(g, range(10))
结果将会是:
>>> print result_squares.get(timeout=1)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> print result_cubes.get(timeout=1)
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]