그냥 실험하고 배우고, 여러 proceses를 사용하여 액세스 할 수있는 공유 사전을 만드는 방법을 알고 있지만 사전을 동기화하는 방법을 모르겠습니다. 은 내가 가진 문제를 설명합니다.다중 처리와 함께 defaultdict 사용 하시겠습니까?
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
(그것 multiprocessing
를 사용하지 않는 때문에),하지만 난 그것을 점점 문제가 multiprocessing
와 함께 작동하는 데 첫 번째 결과가 작동합니다. 나는 그것을 해결하는 방법을 모르겠지만 동기화되지 않아서 (나중에 결과에 합류) 또는 어쩌면 multiprocessing
내에서 사전에 defaultdict(int)
을 설정하는 방법을 알 수 없기 때문일 수 있습니다.
이 기능을 사용하는 방법에 대한 도움이나 제안 사항은 훌륭합니다!
와우, 감사합니다. 나는 당신의 수정을 정말로 이해하지 못한다. MyManager (BaseManager) 클래스의 목적은 무엇인가? – Lostsoul
@Lostsoul Manager가 지원하는 것보다 다른 유형의 공유에 대한 지원을 추가하는 것은 [문서화 된 방법] (http://docs.python.org/library/multiprocessing.html#customized-managers)입니다. –
정말 고마워, 내가 공부할거야! – Lostsoul