2017-03-03 47 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