0

マルチプロセッシング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、理由がわからないリストに追加されているようです。

4

2 に答える 2

1

印刷時に実際に何かが含まれていることを確認することは別dとして、結果はまだです{'task': {'processed_list': ['one', 'two', 'three']}}

#!/usr/bin/python

from multiprocessing import Pool

def spammer_task(my_list):
    #Initialize manager dict
    out= {
        'processed_list': []
    }

    for ele in my_list:
        #process here
        out['processed_list'].append(ele)

    return 'task',out



my_list = ["one", "two", "three"]

if __name__=="__main__":

    p = Pool()
    d=dict(p.imap_unordered(spammer_task, [my_list])) #this line blocks until finished
    print d
于 2016-08-02T10:20:16.697 に答える