如何在多个进程之间共享全局List变量?

时间:2018-06-11 11:38:51

标签: python

当我在进程之间共享一个全局List变量时,我发现变量ID是相同的(不像字符串变量,ID是不同的)。我很好奇ID是否相同,每个进程如何分别设置值?当子进程将值设置为['main', 'beijing']时,父进程如何仍然保持值['main']不变?

#!/usr/bin/python
# -*- coding: utf-8 -*-

from multiprocessing import Pool

oTag = []
print id(oTag)
print oTag

def worker(city):
    global oTag
    oTag.append(city)
    print id(oTag)
    print oTag

def main():
    global oTag
    oTag.append("main")
    print id(oTag)
    print oTag

    cities=["beijing", "shanghai", "guangzhou", "shenzhen"]
    pool = Pool(5)
    pool.map(worker, cities)

    print id(oTag)
    print oTag

if __name__ == "__main__":
    main()

这是输出:

4405903088
[]  
4405903088
['main']
4405903088
['main', 'beijing']
4405903088
['main', 'shanghai']
4405903088
['main', 'guangzhou']
4405903088
['main', 'shenzhen']
4405903088
['main']

1 个答案:

答案 0 :(得分:1)

仅仅因为它们是不同的过程!

C Python说变量的id是变量所在的地址(但即使这是实现细节)。但现代系统使用虚拟内存:操作系统为每个进程提供内存页面,并使用进程使用的虚拟地址与物理内存地址之间的映射。由于所有进程都是彼此的克隆(我假设在Linux或其他类Unix上使用fork),所有进程的虚拟内存地址都是相同的,而每个进程都指向一组不同的物理页面。

因此,每个进程在同一(虚拟)地址看到自己的列表副本,但它们仍然是存储在不同物理地址的不同副本。

如果要使用multiprocessing模块在​​不同进程之间共享状态,可以使用共享内存multiprocessing.Valuemultiprocessing.Arraymultiprocessing.Manager来保存列表和multiprocessing.Proxy访问它。 reference doc.

中的更多详细信息