使用池和多处理同时将两个函数应用于两个列表

时间:2017-03-03 14:11:08

标签: python multiprocessing python-multiprocessing

我有一个(大)男性和女性名单。

我想对每个函数应用不同的函数。

在这种情况下如何使用Pool?鉴于代理商彼此独立。

一个例子是:

males = ['a', 'b', 'c']
females = ['d', 'e', 'f']
for m in males:
    func_m(m)
for f in females:
    func_f(f)
我开始是这样的:

from multiprocessing import Pool
p = Pool(processes=2)
p.map() # Here is the problem

我希望有类似的东西:

p.ZIP(func_f for f in females, func_m for m in males) # pseudocode

2 个答案:

答案 0 :(得分:1)

可以使用map_async异步启动计算。这将启动所需的所有工作,然后您可以使用结果上的get方法将它们收集在一个列表中。

from multiprocessing import Pool

pool = Pool(4)
res_male = pool.map_async(func_m, males)
res_females = pool.map_async(fun_f, females)

res = res_male.get()
res.extend(res_females.get())

您还可以查看更现代的concurrent.futures API,它更直观地进行此类计算。

答案 1 :(得分:0)

不是一个好的答案,但首先想到的是:

import itertools
f = lambda t: func_m(t[0]) if t[1] else func_f(t[0])
p.map(f, itertools.chain(((0,x) for x in females), ((1,x) for x in males)))