gpt4 book ai didi

python - python中的多进程会重新初始化全局变量吗?

转载 作者:行者123 更新时间:2023-11-30 22:18:34 24 4
gpt4 key购买 nike

我有一个多处理程序,无法使用全局变量。我有一个这样开始的程序:-

from multiprocessing import Process ,Pool
print ("Initializing")
someList = []
...
...
...

这意味着我有一些列表变量在调用我的 main 之前被初始化。

稍后在代码中将 someList 设置为某个值,然后我创建 4 个进程来处理它

pool = Pool(4)
combinedResult = pool.map(processFn, someList)
pool.close()
pool.join()

在生成进程之前,someList 设置为有效值。

但是,当进程生成时,我看到此打印 4 次!
正在初始化
正在初始化
正在初始化
正在初始化

很明显,在每个进程中,程序顶部的初始化部分都会被调用。另外,someList 被设置为空。如果我的理解是正确的,每个进程应该是当前进程状态的副本,这本质上意味着,我应该拥有同一列表的 4 个副本。为什么全局变量再次被重新初始化?事实上,为什么要运行该部分?

有人可以向我解释一下吗?我引用了 python 文档,但无法确定根本原因。他们确实建议不要使用全局变量,我也知道这一点,但它仍然没有解释对初始化函数的调用。另外,我想使用多处理而不是多线程。我试图了解多重处理在这里是如何工作的。

感谢您的宝贵时间。

最佳答案

在 Windows 中,进程不像 Linux/Unix 那样 fork 。相反,它们是生成的,这意味着为每个新multiprocessing.Process启动一个新的Python解释器。这意味着所有全局变量都会重新初始化,如果您在此过程中以某种方式操纵了它们,则生成的进程将看不到这一点。

问题的解决方案是将全局变量传递给Pool initilaizer,然后从那里使其在生成的进程中也成为global :

from multiprocessing import Pool

def init_pool(the_list):
global some_list
some_list = the_list

def access_some_list(index):
return some_list[index]

if __name__ == "__main__":
some_list = [24, 12, 6, 3]
indexes = [3, 2, 1, 0]
pool = Pool(initializer=init_pool, initargs=(some_list,))
result = pool.map(access_some_list, indexes)
print(result)

在此设置中,您将把全局变量复制到每个新进程,然后它们就可以访问,但是,与往常一样,从那里完成的任何更新都不会传播到任何其他进程。为此,您将需要诸如适当的 multiprocessing.Manager 之类的东西。

作为额外的评论,从这里可以明显看出全局变量可能是危险的,因为很难理解它们在不同进程中将采用什么值。

关于python - python中的多进程会重新初始化全局变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com