2017-03-03 6 views
4

남성 및 여성 에이전트가있는 (큰) 목록이 있습니다.풀 및 다중 처리를 사용하여 두 개의 목록에 동시에 두 개의 함수 적용

서로 다른 기능을 적용하고 싶습니다.

그런 경우 어떻게 풀을 사용할 수 있습니까? 에이전트는 서로 독립적이라는 것을 감안할 때.

예제는 다음과 같습니다

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

내가 좋아하는 뭔가하고 싶은 :

males = ['a', 'b', 'c'] 
females = ['d', 'e', 'f'] 
for m in males: 
    func_m(m) 
for f in females: 
    func_f(f) 

내가 그렇게 시작

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. 하지만 아무것도 돌려 줄 필요가 없다면? 아이디어는 각 에이전트에서 내부 메소드를 시작하는 것입니다. –

+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, 묘지, 가족, 회사, 연도, 에이전트 = t [0])로 구현되었습니다. , 묘지, 회사, 에이전트 = t [0])'오류가 발생했습니다 : _ _pickle.PicklingError : . at 0x000000000AF9BF28> : 인구 통계에서 의 속성 조회가 실패했습니다. ' –

+0

아,'다중 처리 '는 람다를 사용할 수 없습니다 ... http://stackoverflow.com/questions/4827432/how-to-let-pool-map-take -a-lambda-function – BallpointBen