使用 Pool 和 multiprocessing 同时将两个函数应用于两个列表
Applying two functions to two lists simultaneously using Pool and 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
不是很好的答案,但首先想到的是:
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)))
这可以使用 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,它对于此类计算更直观。
我有一份(大)男女经纪人名单。
我想对每个应用不同的功能。
在这种情况下如何使用 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
不是很好的答案,但首先想到的是:
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)))
这可以使用 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,它对于此类计算更直观。