首页 > 解决方案 > 在多处理池中使用全局变量

问题描述

我在尝试在多处理池中使用全局变量时遇到问题。我知道这方面已经有很多内容了,但我正在努力实现我的案例的答案。

我有一个要与 pool.map 一起使用的函数。我希望这个函数的输入是一些全局变量,也是另一个改变进程到进程的参数。那就是我想要的东西看起来像:


if __name__ == '__main__':

   A = Global Variable Array
   B = Global Variable Array
   C = Actual Input Array For the Multiprocessing

   pool = multiprocessing.Pool()
   Res= pool.map(Function,Input = A,B,C)

在上述情况下,只有 C 因进程而异。目前,我的代码仅在我从每个进程中的外部文件导入全局数组时才有效,这似乎非常浪费。

标签: pythonmultiprocessing

解决方案


multiprocessing提供了几种在进程之间共享状态的方法。对这些对象的访问可能由lockarg 同步。

如果lock为 True(默认值),则创建一个新的递归锁对象以同步对值的访问。如果lock是 Lock 或 RLock 对象,那么它将用于同步对值的访问。如果lock为 False,那么对返回对象的访问将不会被锁自动保护,因此它不一定是“进程安全的”。

来自官方文档的示例:

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])

推荐阅读