2017-03-03 69 views
4

我有一个(大)列表与男性和女性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 

回答

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,它是这类计算的更直观。

+0

谢谢@ thomas-moreau。但是如果我不需要返回任何东西呢?这个想法只是为了在每个agente开始内部方法。 –

+0

嗯。我遇到了一个错误'在当前进程完成引导阶段之前,已经尝试开始一个新进程。 这可能意味着你不使用叉子,开始您的 子进程,你已经忘记了使用正确的成语 主要模块: 如果__name__ ==“__main__”: freeze_support()' –

+0

一个更事情。该计算是导入和执行的模块的一部分。如果__name__ ==“__main__”:? –

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))) 
+0

谢谢。如果实际上我有多个参数可以通过,我该如何实现呢? –

+0

如果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 在0x000000000AF9BF28>:属性查找人口统计学失败' –

+0

噢,'多处理'不能采取lambdas ... http://stackoverflow.com/questions/4827432/how-to-let-pool-map-take -a-lambda-function – BallpointBen

相关问题