Python多处理全局变量访问问题

问题描述 投票:0回答:1

我是多处理Python的初学者。我有以下代码,但我无法理解为什么它不起作用。有人可以解释一下为什么这不起作用吗?

from multiprocessing import Pool
db_conn = ""
db_sel = ""

def new_func(i):
    global db_conn, db_sel
    print(db_conn, db_sel)

if __name__ == "__main__":
    db_conn = "56"
    db_sel = "64"
    with Pool() as p:
        p.map(new_func, range(5))

我期望输出打印 56 64 5 次,但程序打印空间。多处理不会读取全局变量吗?

python python-3.x multiprocessing
1个回答
0
投票

在代码中,您在主进程中设置全局变量 db_conn 和 db_sel,但是当 Pool 的工作进程执行 new_func 函数时,它们正在使用这些全局变量自己的单独副本。因此,主进程中全局变量的更改不会影响工作进程,并且 new_func 中的 print(db_conn, db_sel) 语句可以显示空字符串。

很多时候它也可能有效,但行为是间歇性的。因此,在 python 3.8 中,人们已经不再使用 fork。

https://github.com/python/cpython/issues/84559

您可以使用 multiprocessing.Manager 来创建可由不同进程访问的对象。

这样的东西应该有效

    with Manager() as manager:
        db_conn = manager.Value('s', "56")
        db_sel = manager.Value('s', "64")

有关多处理的更多详细信息。管理器的使用可以在链接上找到 如何使用multiprocessing.Manager().Value来存储总和?

© www.soinside.com 2019 - 2024. All rights reserved.