実験と学習だけで、複数の処理でアクセスできる共有辞書を作成する方法はわかっていますが、辞書を同期させておく方法がわかりません。 defaultdict
、私は、私が持っている問題を示していると信じています。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