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