我有一個元素列表,我正在處理多處理apply_async
任務中的元素,並使用經理字典中的一個關鍵字逐個處理元素,我想在其中映射整個列表。修改多處理池的經理字典中的列表
我嘗試下面的代碼:
在最後乾脆在字典職位空單。 輸出:
{'task': {'processed_list': []}}
現在研究了一下後,我才知道該經理字典中的元素成爲不可變的,所以你必須以更新它重新初始化新的數據字典整體。所以我試着下面的代碼,它給出了一個奇怪的錯誤。
#!/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
輸出:
Traceback (most recent call last): File "./a.py", line 29, in p.apply_async(spammer_task (d, my_list)) File "./a.py", line 14, in spammer_task new_list = old_list.append(ele) AttributeError: 'NoneType' object has no attribute 'append'
不知怎的,這似乎是追加None
,而我無法弄清楚,爲什麼名單。
也許這只是一個愚蠢的問題,但對我來說,它看起來像你的例子會更好使用imap - 爲什麼你會使用apply_async? – janbrohl
這只是一個示例程序,主要使用apply_async來處理它正在做的一些事情。此外,它調用它的多個進程 – MohitC
更準確地說 - 我的意思是使用Pool.imap具有多個進程並在主進程中修改字典,因爲這不應該在計算上花費太多。這對我來說似乎比製作大量副本和額外同步更明智 – janbrohl