2017-04-11 8 views
0

다른 함수를 병렬로 실행하고 (foo, bar 및 baz) 각 함수가 반환 한 값을 순서대로 반환하고 싶습니다. 라는.다른 함수를 병렬로 실행하고 반환 된 값을 특정 순서로 가져옵니다.

나는 아래 코드와 같은 것을 시도했지만, 어떤 이유로는 Windows에서 영원히 반복됩니다. 예를 들어 multiprocessing을 사용하여이를 달성 할 수 있습니까? 함수는 동일한 매개 변수 (즉, 데이터)를 취할 것으로 예상됩니다.

참고 : 아래 코드는 Python 3 용이므로 Python 2.7에 해당하는 기능을 사용하고 싶습니다.

from concurrent.futures import ProcessPoolExecutor 
from operator import itemgetter 

def foo(data): 
    return "foo" 

def bar(data): 
    return "bar" 

def baz(data): 
    return "baz" 

work = [foo, bar, baz] 
data = [1,2,3,4,5] 

results = [] 

with ProcessPoolExecutor(max_workers=4) as pool: 
    for i, work_item in enumerate(work): 
     future = pool.submit(work_item, data) 
     def callback(ret): 
      results.append((i, ret.result())) 
     future.add_done_callback(callback) 

results.sort(key=itemgetter(0)) 
print(results) 

답변

1

콜백 메소드를 약간 변경하여 원하는대로 달성했다고 생각됩니다.

... 
with ProcessPoolExecutor(max_workers=4) as pool: 
    for i, work_item in enumerate(work): 
     future = pool.submit(work_item, data) 
     def callback(i): 
      def wrapper(ret): 
       print(ret, i) 
       results.append((i, ret.result())) 
      return wrapper 
     future.add_done_callback(callback(i)) 
... 

을 다음과 같이 결과는 다음과 같습니다 : 결과를 확인

<Future at 0x1057e4d30 state=finished returned str> 0 
<Future at 0x1057e4a58 state=finished returned str> 2 
<Future at 0x105779240 state=finished returned str> 1 
[(0, 'foo'), (1, 'bar'), (2, 'baz')] 

내가 python3와 맥 OS X에서이 코드를 실행합니다. 나는 그것이 도움이되기를 바랍니다.

from multiprocessing import Process, Manager 

def foo(data, i, results): 
    results[i] = "foo" 

def bar(data, i, results): 
    results[i] = "bar" 

def baz(data, i, results): 
    results[i] = "baz" 

work = [foo, bar, baz] 
data = [1,2,3,4,5] 

processes = [] 
results = Manager().dict() 
for i, w in enumerate(work): 
    p = Process(target=w, args=(data, i, results)) 
    processes.append(p) 
    p.start() 

for p in processes: 
    p.join() 

print results 

결과는 다음과 같습니다 :

파이썬 2.7를 들어, 다음과 같이 뭔가를 시도 할 수 있습니다

{0: 'foo', 1: 'bar', 2: 'baz'} 

How can I recover the return value of a function passed to multiprocessing.Process?

+0

내가 주어진 코드를 파이썬 3 것을 언급하는 것을 잊었다 (그리고 Windows에서는 작동하지 않습니다). 그러나 Python 2.7에서 작동하는 코드를 사용해야합니다. – eLearner

+0

다음 페이지에서 살펴보십시오. https://pymotw.com/2/multiprocessing/communication.html – Muatik

+0

파이썬 2.7의 답변을 업데이트했습니다. – Muatik