2012-06-13 30 views
5

tôi muốn chia sẻ một cuốn từ điển giữa các quá trình của tôi như sau:Python chia sẻ một cuốn từ điển giữa các quá trình song song

def f(y,x): 
    y[x]=[x*x]               

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = range(10) 
    y={}        
    result = pool.map(f,y,inputs) 

Lợi nhuận y {}. Làm thế nào tôi có thể làm cho nó hoạt động?

Xin cảm ơn,

+1

Điều này nghe giống như một công việc cho Redis! –

+0

Redis là gì ?? – Amir

+2

http://www.google.com/search?q=redis –

Trả lời

9

Có vẻ như bạn đang sử dụng mô-đun multiprocessing. Bạn đã không nói, và đó là một chút thông tin quan trọng.

Hàm .map() trên một thể hiện multiprocessing.Pool() lấy hai đối số: một hàm và một chuỗi. Hàm sẽ được gọi với các giá trị kế tiếp từ chuỗi. Bạn đang cố gắng để vượt qua y và một chuỗi và điều đó sẽ không hoạt động.

Bạn có thể tạo một chuỗi như sau: ((y, x) for x in input) và viết hàm lấy một đối số, một bộ và sau đó thực hiện điều đúng với nó. Tôi chỉ sử dụng multiprocessing.Pool() để chạy các quy trình đọc và ghi tệp đĩa, vì vậy tôi không chắc chắn ý tưởng cơ bản sẽ hoạt động như thế nào ở đây: Tôi không chắc chắn bạn sẽ có thể thay đổi một dict như bạn đang cố gắng làm .

Tôi khuyên bạn chỉ nên chuyển các giá trị trở lại từ hàm của bạn, sau đó thu thập chúng để tạo kết quả cuối cùng của bạn. Tôi chỉ kiểm tra mã này và nó hoạt động:

import multiprocessing as mp 

def f(x): 
    return (x, x*x) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    result = dict(pool.map(f, inputs)) 

result được thiết lập để: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

Hãy thay đổi nó để thay vì máy tính x*x nó sẽ nâng cao x một số quyền lực, và sức mạnh sẽ được cung cấp. Và chúng ta hãy làm cho nó lấy một đối số khóa chuỗi. Điều này có nghĩa là f() cần lấy tham số tuple, trong đó tuple sẽ là (key, x, p) và nó sẽ tính x**p.

import multiprocessing as mp 

def f(tup): 
    key, x, p = tup # unpack tuple into variables 
    return (key, x**p) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    inputs = [("1**1", 1, 1), ("2**2", 2, 2), ("2**3", 2, 3), ("3**3", 3, 3)] 
    result = dict(pool.map(f, inputs)) 

Nếu bạn có một vài trình tự và bạn cần phải tham gia cùng họ với nhau để tạo ra một chuỗi duy nhất cho ở trên, nhìn vào sử dụng zip() hoặc có lẽ itertools.product.

+0

Làm cách nào để thêm một đối số khác vào f? Tôi đã làm def f (x, i): .... và sau đó pool.map (f, input, 1), nhưng python không thích nó. Nó trả về f() lấy chính xác 2 đối số – Amir

+1

'pool.map()' nhận một hàm và một chuỗi. Trình tự có thể là một chuỗi các tuples hoặc danh sách, và đó sẽ là cách bạn vượt qua các đối số bổ sung. Tôi sẽ thêm một ví dụ nữa. – steveha

+1

Nếu bạn thực sự muốn có một từ điển được chia sẻ giữa các quy trình, hãy xem Manager.dict trong mô-đun đa xử lý. – danielm

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