在Python中使用多处理程序更新全局变量

时间:2018-07-19 03:01:22

标签: python-3.x python-multiprocessing

我正在使用多重处理来加快程序的速度(顺便说一下,大大加快了速度),但是更新某个全局变量至关重要。全局变量仅在使用多处理的同一类中使用,因此可能有一种变通方法,该变量不会更新。这是我用来尝试解决此问题的测试代码:

aylmao = []

def test(a):
    aylmao.append(a)


if __name__ == '__main__':
    d = [1,2,3,4,5,6,7,8,9]
    pool = Pool(cpu_count() * 2)
    pool.map(test, d)

    print(aylmao)

因此在我的主要代码中,我有一个使用pool.map调用的函数,它会更新此全局变量。但是在程序结束时,它会在全局变量中提取信息,以便我可以从程序中断处继续执行。但是,使用pool.map可以使此全局变量在打印时为空,我不确定如何解决。非常感谢任何帮助,因为使用pool.map大大提高了我的程序的速度。

如果我改为运行如下代码:

aylmao = []

def test(a):
    aylmao.append(a)


if __name__ == '__main__':
    d = [1,2,3,4,5,6,7,8,9]
    for i in d:
        test(i)

    print(aylmao)

输出正是[1,2,3,4,5,6,7,8,9]这正是我想要的。但是当使用pool.map(test,d)时,输出为[]。如何在使用pool.map(test,d)

时确保全局变量正在更新

1 个答案:

答案 0 :(得分:1)

使用multiprocessing.Manager

from multiprocessing import *

manager = Manager()
aylmao = manager.list()

def test(a):
    aylmao.append(a)

d = [1,2,3,4,5,6,7,8,9]
pool = Pool(cpu_count() * 2)
pool.map(test, d)

print(aylmao)
# => [1, 2, 5, 4, 3, 6, 8, 7, 9]

编辑:“如果aylmao是将字符串映射到我创建的对象的映射,那该怎么办?”

from multiprocessing import *

class Foo:
    def __init__(self, n):
        self.n = n
    def __repr__(self):
        return "Foo(%d)" % self.n

manager = Manager()
aylmao = manager.dict()

def test(a):
    aylmao[str(a)] = Foo(a)

d = [1,2,3,4,5,6,7,8,9]
pool = Pool(cpu_count() * 2)
pool.map(test, d)

print(aylmao)
# => {'1': Foo(1), '3': Foo(3), '2': Foo(2), '4': Foo(4), '5': Foo(5), '7': Foo(7), '6': Foo(6), '8': Foo(8), '9': Foo(9)}
相关问题