2011-08-07 29 views
10

Hầu hết các ví dụ về các nhóm công nhân đa xử lý thực thi một hàm duy nhất trong các quy trình khác nhau, f.e.Các nhóm Mulitprocess với các chức năng khác nhau

def foo(args): 
    pass 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=30) 
    res=pool.map_async(foo,args) 

Có cách nào xử lý hai chức năng khác nhau và độc lập trong hồ bơi không? Để bạn có thể gán f.e. 15 quy trình cho foo() và 15 quy trình cho thanh() hoặc là một hồ bơi được liên kết với một hàm duy nhất? Hoặc bạn phải tạo các quy trình khác nhau cho các chức năng khác nhau theo cách thủ công với

p = Process(target=foo, args=(whatever,)) 
q = Process(target=bar, args=(whatever,)) 
q.start() 
p.start() 

và quên hồ bơi công nhân?

Trả lời

14

Để chuyển các chức năng khác nhau, bạn có thể chỉ cần gọi map_async nhiều lần.

Dưới đây là một ví dụ để minh họa rằng,

from multiprocessing import Pool 
from time import sleep 

def square(x): 
    return x * x 

def cube(y): 
    return y * y * y 

pool = Pool(processes=20) 

result_squares = pool.map_async(f, range(10)) 
result_cubes = pool.map_async(g, range(10)) 

Kết quả sẽ là:

>>> print result_squares.get(timeout=1) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

>>> print result_cubes.get(timeout=1) 
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729] 
+0

Và họ sẽ được thực hiện song song hoặc "liên tiếp"? – dorvak

+2

'map_async' trả về ngay lập tức. Miễn là có đủ quy trình miễn phí trong hồ bơi, nhiệm vụ mới sẽ được chạy mà không cần phải đợi. Trong ví dụ trên, chúng sẽ chạy song song. @mad_scientist –

+1

Thx! Nhưng không có cách nào để chỉ định số lượng công nhân/quy trình cụ thể, tôi đoán vậy? – dorvak

1

Họ sẽ không chạy song song. Xem mã sau:

def updater1(q,i):  
    print "UPDATER 1:", i 
    return 

def updater2(q,i):  
    print "UPDATER2:", i 
    return 

if __name__=='__main__': 
    a = range(10) 
    b=["abc","def","ghi","jkl","mno","pqr","vas","dqfq","grea","qfwqa","qwfsa","qdqs"] 


    pool = multiprocessing.Pool() 

    func1 = partial(updater1,q) 
    func2 = partial(updater2,q) 
    pool.map_async(func1, a) 
    pool.map_async(func2, b) 

    pool.close() 
    pool.join() 

Đoạn mã trên mang lại những bản in sau:

UPDATER 1: 1 
UPDATER 1: 0 
UPDATER 1: 2 
UPDATER 1: 3 
UPDATER 1: 4 
UPDATER 1: 5 
UPDATER 1: 6 
UPDATER 1: 7 
UPDATER 1: 8 
UPDATER 1: 9 
UPDATER2: abc 
UPDATER2: def 
UPDATER2: ghi 
UPDATER2: jkl 
UPDATER2: mno 
UPDATER2: pqr 
UPDATER2: vas 
UPDATER2: dqfq 
UPDATER2: grea 
UPDATER2: qfwqa 
UPDATER2: qwfsa 
UPDATER2: qdqs 
Các vấn đề liên quan