Python 多处理期间的全局变量访问

时间:2021-07-14 07:06:41

标签: python multiprocessing

命名两个列表 A、B

我想从 A 列表中删除 B 列表元素。

未使用多处理的 Python 代码

A = ["leo", "kiki", "eden"]
B = ["eden", "kiki"]

for i in B:
    A.remove(i)

我想到的多处理代码如下。

from multiprocessing import Pool
import time
A = ["leo", "kiki", "eden"]
B = ["eden", "kiki"]


def test(i):
    global A
    A.remove(i)
    print("intest : ",A)




if __name__ == '__main__':
    global A
    pool = Pool(processes=2)
    pool.map(test ,B)
    pool.close()
    pool.join()
    print("final : ",A)

输出结果:

intest :  ['leo', 'kiki']
intest :  ['leo']
final :  ['leo', 'kiki', 'eden']

为什么在“intest”中全局变量正确应用。

在“final”中,全局变量更改不适用?

请给我很多帮助。

2 个答案:

答案 0 :(得分:0)

进程间不共享全局变量。当你创建一个新进程时,它是一个不同的 python 实例被启动。它们不能共享价值,它们只是在创建时被复制。您对子进程所做的任何调整只会对该进程可见,而不是启动它们的原始 Python 进程。

要解决此问题,您可以使用多处理模块中的 managers。您可以创建一个 manager.list() 以允许在进程之间共享值。以下示例删除了全局参数并使用了 Manager 类:

import time
from multiprocessing import Pool
from multiprocessing import Manager


def test(test_list,i):
    test_list.remove(i)
    print("intest : ", test_list)
    

if __name__ == '__main__':
    with Manager() as manager:
        A = manager.list(["leo", "kiki", "eden"])
        B = ["eden", "kiki"]

        print("Start : ", A)
        pool = Pool(processes=2)
        pool.starmap(test, [(A, K) for K in B])
        pool.close()
        pool.join()
        print("Final : ", A)

答案 1 :(得分:0)

多线程时使用 global 共享内存就足够了。在多进程上共享内存必须以不同的方式实现,这是因为不同的进程处理变量和对象的不同“副本”。进程间共享内存可以通过使用多处理模块的 SharedMemory 类来实现,该类还提供了创建类列表对象的能力,这些对象可以通过使用 ShareableList 类在进程之间共享。所以你应该这样转换你的代码:

from multiprocessing import shared_memory
A = shared_memory.ShareableList(["leo", "kiki", "eden"])
# you must always close and unlink shared_memory
A.shm.close()
A.shm.unlink()    

您可以在官方 python 文档中阅读更多相关信息: https://docs.python.org/3/library/multiprocessing.shared_memory.html

相关问题