マルチプロセッシングapply_async
タスクで処理している要素のリストがあり、リスト全体をマップしたいマネージャー辞書のキーで1つずつ処理された要素を更新しています。
次のコードを試しました:
#!/usr/bin/python
from multiprocessing import Pool, Manager
def spammer_task(d, my_list):
#Initialize manager dict
d['task'] = {
'processed_list': []
}
for ele in my_list:
#process here
d['task']['processed_list'].append(ele)
return
p = Pool()
m = Manager()
d = m.dict()
my_list = ["one", "two", "three"]
p.apply_async(spammer_task (d, my_list))
print d
最後に、dictに空のリストを投稿するだけです。出力:
{'タスク': {'処理済みリスト': []}}
少し調べたところ、マネージャー dict 内の要素が不変になるため、更新するには新しいデータで dict 全体を再初期化する必要があることがわかりました。SO 私は次のコードを試してみましたが、奇妙なエラーが発生します。
#!/usr/bin/python
from multiprocessing import Pool, Manager
def spammer_task(d, my_list):
#Initialize manager dict
d['task'] = {
'processed_list': []
}
for ele in my_list:
#process here
old_list = d['task']['processed_list']
new_list = old_list.append(ele)
#Have to do it this way since elements inside a manager dict become
#immutable so
d['task'] = {
'processed_list': new_list
}
return
p = Pool()
m = Manager()
d = m.dict()
my_list = ["one", "two", "three"]
p.apply_async(spammer_task (d, my_list))
print d
出力:
トレースバック (最新の呼び出しが最後): ファイル "./a.py"、29 行目、p.apply_async(spammer_task (d, my_list)) ファイル "./a.py"、14 行目、spammer_task new_list = old_list. append(ele) AttributeError: 'NoneType' オブジェクトには属性 'append' がありません
どういうわけかNone
、理由がわからないリストに追加されているようです。