使用池和多处理同时对两个列表应用两个函数
我有一个(大)列表与男性和女性agentes。使用池和多处理同时对两个列表应用两个函数
我想对每个应用不同的功能。
如何在这种情况下使用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
这可以使用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,它是这类计算的更直观。
不是一个伟大的答案,但首先想到的是:
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)))
谢谢。如果实际上我有多个参数可以通过,我该如何实现呢? –
如果t [1] \ else process_females(mortality_women,fertility,year,families,my_agents),我实现为'f = lambda t:process_males(mortality_men,my_agents,graveyard,families,firm,year,agent = t [0] ,graveyard,firm,agent = t [0])'但是,出现了一个错误:'_pickle.PicklingError:Can not pickle
噢,'多处理'不能采取lambdas ... http://*.com/questions/4827432/how-to-let-pool-map-take -a-lambda-function – BallpointBen
谢谢@ thomas-moreau。但是如果我不需要返回任何东西呢?这个想法只是为了在每个agente开始内部方法。 –
嗯。我遇到了一个错误'在当前进程完成引导阶段之前,已经尝试开始一个新进程。 这可能意味着你不使用叉子,开始您的 子进程,你已经忘记了使用正确的成语 主要模块: 如果__name__ ==“__main__”: freeze_support()' –
一个更事情。该计算是导入和执行的模块的一部分。如果__name__ ==“__main__”:? –