2010-05-29 35 views
6

Tôi cần chia sẻ một từ điển lớn (khoảng 1 gb) giữa nhiều quá trình, tuy nhiên vì tất cả các quy trình sẽ luôn đọc từ đó. Tôi không cần khóa.Cách chia sẻ từ điển giữa nhiều quy trình trong python mà không cần khóa

Có cách nào để chia sẻ từ điển mà không cần khóa không?

Module đa trong python cung cấp một lớp Array cho phép chia sẻ mà không cần khóa bằng cách thiết lập
khóa = false
tuy nhiên Không có tùy chọn như vậy cho từ điển cung cấp bởi người quản lý trong đa xử module.

Trả lời

5

Vâng, trên thực tế, dict trên một người quản lý không có ổ khóa nào cả! Tôi đoán điều này đúng với đối tượng được chia sẻ khác mà bạn có thể tạo thông qua người quản lý. Làm thế nào tôi biết điều này? Tôi cố gắng:

from multiprocessing import Process, Manager 

def f(d): 
    for i in range(10000): 
     d['blah'] += 1 

if __name__ == '__main__': 
    manager = Manager() 

    d = manager.dict() 
    d['blah'] = 0 
    procs = [ Process(target=f, args=(d,)) for _ in range(10) ] 
    for p in procs: 
     p.start() 
    for p in procs: 
     p.join() 

    print d 

Nếu có ổ khóa trên d, kết quả sẽ là 100000. Nhưng thay vào đó, kết quả là khá ngẫu nhiên và vì vậy đây chỉ là một minh họa tốt đẹp tại sao ổ khóa là cần thiết khi bạn sửa đổi công cụ ;-)

Vì vậy, hãy tiếp tục và sử dụng manager.dict().

+0

Tôi thấy điều kiện chủng tộc: d ['blah'] + = 1 thực sự là d ['blah'] = d ['blah'] + 1 chia nhỏ để nhận d ['blah'], thêm 1, và sau đó lưu trữ trong d ['blah']. Trong thời gian đó, quá trình khác có thể đã thay đổi nó. Người quản lý trong trường hợp này chỉ cung cấp proxy để truy cập dict. Thực sự nên sử dụng người quản lý để tạo ra một khóa giữa việc đọc và bổ sung lại cho dict. – dalore

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