Python 多处理池中的全局变量

Python 多处理池中的全局变量,python,windows,multiprocessing,pool,Python,Windows,Multiprocessing,Pool,我知道这个问题以前在这里讨论过,但我就是找不到任何有效的方法。 我想在我的多处理进程之间共享一个全局变量,而不需要任何进程更改它,即它们只需要读取访问。举一个简单的例子: def f(x): return x**GlobalVar if __name__ == '__main__': GlobalVar = 6 pool = multiprocessing.Pool() res= pool.map(f,[1,2,3

我知道这个问题以前在这里讨论过,但我就是找不到任何有效的方法。 我想在我的多处理进程之间共享一个全局变量,而不需要任何进程更改它,即它们只需要读取访问。举一个简单的例子:

    def f(x):
        return x**GlobalVar

    if __name__ == '__main__':
        GlobalVar = 6
        pool = multiprocessing.Pool()
        res= pool.map(f,[1,2,3,4])
        print(res)

现在这显然不起作用,因为进程将无法访问GlobalVar。因此,为了让它发挥作用,我会在每个单独的过程中评估GlobalVar,或者从文件导入它。在我的应用程序中,GlobalVar是一个非常大的数组,这是非常浪费的。如何在进程之间轻松共享这个全局变量,而只在内存中存储它的一个副本?我想重申,进程只需要读取这个全局变量,而不需要更改它。

非常简单的方法是将它作为参数传递给在每个进程中执行的
f
。但是如果全局变量太大,并且您不希望在每个进程中都有它的副本,并且您只打算执行读取操作,那么您可以使用共享内存

样本(内联记录) 输出:

[6, 12, 18]

查找正式文档。

由于您希望共享的变量是只读的且是“简单”整数,因此您只需在全局范围内声明它,使其对多处理池中的子进程可见:

导入多处理
GlobalVar=6
def f(x):
返回x**GlobalVar
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
池=多处理。池()
res=pool.map(f[1,2,3,4])
打印(res)
印刷品:

[1, 64, 729, 4096]
讨论

在讨论Python和多处理时,您在哪个平台上运行总是相关的,我已经更新了您的标记以添加
Windows
(尽管现在编写的代码也可以在Linux上运行)

在Windows上创建新进程(或创建进程池时使用进程)时,将使用
spawn
。这意味着新进程不会继承主进程建立的变量,而是为每个新进程启动一个新的Python解释器,并从程序顶部开始执行。这就是为什么您必须将启动新进程的代码封装在
块中,如果uuuu name\uuuuu=='\uuuuu main\uuuuu':
块中,否则您将进入递归循环。但是由于这个原因,您必须将
GlobalVar
的声明移动到全局范围,否则将不会为新创建的流程定义该变量

为池中的每个子进程初始化全局变量的另一种方法是使用池初始值设定项函数,它使您能够执行比这更详细的操作:

导入多处理
def初始池(初始池):
全球卫星
GlobalVar=整数
def f(x):
返回x**GlobalVar
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
GlobalVar=6
pool=multiprocessing.pool(initializer=init_pool,initargs=(GlobalVar,))
res=pool.map(f[1,2,3,4])
打印(res)

如果相关,我正在运行Windows。。。
[1, 64, 729, 4096]