2017-04-11 34 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 Mac OS X中的代碼。我希望它有幫助。

爲蟒蛇2.7,你可以嘗試這樣的事:

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 

結果是:

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

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

+0

我忘了提,給定的代碼就是Python 3(和在Windows上不起作用),但我想要一個與Python 2.7一起工作的代碼,因爲它是我需要使用的。 – eLearner

+0

然後看看這個頁面:https://pymotw.com/2/multiprocessing/communication.html – Muatik

+0

我更新了python 2.7的答案 – Muatik

相關問題