全局变量和 Python 多处理 [重复]

Posted

技术标签:

【中文标题】全局变量和 Python 多处理 [重复]【英文标题】:Globals variables and Python multiprocessing [duplicate] 【发布时间】:2012-06-28 06:08:53 【问题描述】:

可能重复:Python multiprocessing global variable updates not returned to parent

我正在使用具有多个内核的计算机,为了提高性能,我真的应该使用多个内核。但是,我很困惑为什么这些代码没有达到我的预期:

from multiprocessing import Process

var = range(5)
def test_func(i):
    global var
    var[i] += 1

if __name__ == '__main__':
    jobs = []
    for i in xrange(5):
        p = Process(target=test_func,args=(i,))
        jobs.append(p)
        p.start()

print var

还有

from multiprocessing import Pool

var = range(5)
def test_func(i):
    global var
    var[i] += 1

if __name__ == '__main__':
    p = Pool()
    for i in xrange(5):
        p.apply_async(test_func,[i])

print var

我希望结果是[1, 2, 3, 4, 5],但结果是[0, 1, 2, 3, 4]

在将全局变量与进程一起使用时,我肯定遗漏了一些微妙之处。这甚至是要走的路还是我应该避免尝试以这种方式更改变量?

【问题讨论】:

看这个问题***.com/questions/659865/… 您是从脚本运行这些代码 sn-ps,还是在 Python 控制台中执行? 您应该使用多处理管理器来管理您的列表。 多处理线程对全局变量所做的任何更改都不会在父进程中可见,因为线程接收到父内存的写时复制视图 【参考方案1】:

如果您正在运行两个单独的进程,那么它们将不会共享相同的全局变量。如果要在进程之间传递数据,请查看使用 send 和 recv。请查看http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes 以获取与您正在做的类似的示例。

【讨论】:

以上是关于全局变量和 Python 多处理 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python中的多处理模块和修改共享的全局变量

python多处理子进程无法访问全局变量

父进程全局变量如何复制到python多处理中的子进程

python多处理是否通过全局标志变量安全地进行进程间信令?

Python多处理:我可以使用更新的全局变量重用进程(已经并行化的函数)吗?

python多线程全局变量和锁