2013-10-31 17 views
9

Tôi mất cả đêm để gỡ lỗi mã của mình và cuối cùng tôi đã tìm thấy vấn đề phức tạp này. Vui lòng xem mã bên dưới.chức năng gọi lại hoạt động như thế nào trong python multiprocessing map_async

from multiprocessing import Pool 

def myfunc(x): 
    return [i for i in range(x)] 

pool=Pool() 

A=[] 
r = pool.map_async(myfunc, (1,2), callback=A.extend) 
r.wait() 

Tôi nghĩ mình sẽ nhận được A=[0,0,1], nhưng đầu ra là A=[[0],[0,1]]. Điều này không có ý nghĩa với tôi bởi vì nếu tôi có A=[], A.extend([0])A.extend([0,1]) sẽ cho tôi A=[0,0,1]. Có thể gọi lại hoạt động theo một cách khác. Vì vậy, câu hỏi của tôi là làm thế nào để có được A=[0,0,1] thay vì [[0],[0,1]]? Cảm ơn bạn trước cho bất kỳ ý kiến.

+0

Bạn đang sử dụng hệ điều hành và phiên bản python nào? –

Trả lời

20

Gọi lại được gọi một lần với kết quả ([[0], [0, 1]]) nếu bạn sử dụng map_async.

>>> from multiprocessing import Pool 
>>> def myfunc(x): 
...  return [i for i in range(x)] 
... 
>>> A = [] 
>>> def mycallback(x): 
...  print('mycallback is called with {}'.format(x)) 
...  A.extend(x) 
... 
>>> pool=Pool() 
>>> r = pool.map_async(myfunc, (1,2), callback=mycallback) 
>>> r.wait() 
mycallback is called with [[0], [0, 1]] 
>>> print(A) 
[[0], [0, 1]] 

Sử dụng apply_async nếu bạn muốn gọi lại mỗi lần.

pool=Pool() 
results = [] 
for x in (1,2): 
    r = pool.apply_async(myfunc, (x,), callback=mycallback) 
    results.append(r) 
for r in results: 
    r.wait() 
+1

Mã này không hoạt động, bạn cần đặt mã này dưới câu lệnh 'if __name__ == '__main __'' –

+7

@GamesBrainiac, [(trong Windows)] (http://docs.python.org/2/library/multiprocessing .html # windows). – falsetru

+1

Oh! Xin lỗi sau đó. Bạn may mắn mac/linux guys: P –

Các vấn đề liên quan