我是多处理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 次,但程序打印空间。多处理不会读取全局变量吗?
在代码中,您在主进程中设置全局变量 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来存储总和?