具有不同功能的多进程池

26 投票
6 回答
33135 浏览
提问于 2025-04-16 23:05

大多数关于多进程工作池的例子都是在不同的进程中执行同一个函数,比如:

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]

撰写回答