繁体   English   中英

在多处理池的管理器字典中修改列表

[英]Modify a list in Multiprocessing pool's manager dict

我有一个要在多处理apply_async任务中处理的元素的列表,并使用要映射整个列表的管理器字典中的键逐个更新了已处理的元素。

我尝试了以下代码:

#!/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中发布空列表。 输出:

{'任务':{'processed_list':[]}}

现在,在进行了一些研究之后,我知道manager dict中的元素变得不可变,因此您必须使用新数据重新初始化整个dict以进行更新。 所以我尝试了下面的代码,它给出了一个奇怪的错误。

#!/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

输出:

追溯(最近一次通话):p.apply_async中的文件“ ./a.py”,第29行(spammer_task(d,my_list)),第14行中的文件“ ./a.py”,在spammer_task中,new_list = old_list。 append(ele)AttributeError:'NoneType'对象没有属性'append'

似乎以某种方式将None附加到我无法弄清原因的列表中。

https://bugs.python.org/issue6766上找到解决方案

以下代码修复了此问题,方法是复制整个任务字典,然后对其进行修改并重新复制

#!/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
        foo = d['task']
        foo['processed_list'].append(ele)
        d['task'] = foo
    return

p = Pool()
m = Manager()
d = m.dict()

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

p.apply_async(spammer_task (d, my_list))
print d

输出:

{'任务':{'processed_list':['一个','两个','三个']}}

除了确保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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM