Chỉ cần thử nghiệm và tìm hiểu và tôi biết cách tạo một từ điển được chia sẻ có thể được truy cập với nhiều trình xử lý nhưng tôi không chắc chắn cách giữ đồng bộ hóa dict. defaultdict
, tôi tin, minh họa sự cố tôi đang gặp phải.Sử dụng chế độ mặc định với đa xử lý?
from collections import defaultdict
from multiprocessing import Pool, Manager, Process
#test without multiprocessing
s = 'mississippi'
d = defaultdict(int)
for k in s:
d[k] += 1
print d.items() # Success! result: [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
print '*'*10, ' with multiprocessing ', '*'*10
def test(k, multi_dict):
multi_dict[k] += 1
if __name__ == '__main__':
pool = Pool(processes=4)
mgr = Manager()
multi_d = mgr.dict()
for k in s:
pool.apply_async(test, (k, multi_d))
# Mark pool as closed -- no more tasks can be added.
pool.close()
# Wait for tasks to exit
pool.join()
# Output results
print multi_d.items() #FAIL
print '*'*10, ' with multiprocessing and process module like on python site example', '*'*10
def test2(k, multi_dict2):
multi_dict2[k] += 1
if __name__ == '__main__':
manager = Manager()
multi_d2 = manager.dict()
for k in s:
p = Process(target=test2, args=(k, multi_d2))
p.start()
p.join()
print multi_d2 #FAIL
Kết quả đầu tiên làm việc (vì nó không sử dụng multiprocessing
), nhưng tôi đang gặp vấn đề nhận được nó để làm việc với multiprocessing
. Tôi không chắc chắn làm thế nào để giải quyết nó nhưng tôi nghĩ rằng có thể là do nó không được đồng bộ hóa (và tham gia các kết quả sau này) hoặc có thể bởi vì trong vòng multiprocessing
Tôi không thể tìm cách đặt defaultdict(int)
vào từ điển.
Bất kỳ trợ giúp hoặc đề xuất nào về cách thực hiện công việc này sẽ tuyệt vời!
Thật tuyệt vời, cảm ơn bạn. Tôi không thực sự hiểu các sửa đổi của bạn, Mục đích của lớp MyManager (BaseManager) là gì? – Lostsoul
@Lostsoul Đó là [cách được ghi lại] (http://docs.python.org/library/multiprocessing.html#customized-managers) để thêm hỗ trợ chia sẻ các loại khác so với những gì Trình quản lý hỗ trợ. –
Cảm ơn bạn rất nhiều, tôi sẽ nghiên cứu nó! – Lostsoul