当我在进程之间共享一个全局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']
答案 0 :(得分:1)
仅仅因为它们是不同的过程!
C Python说变量的id是变量所在的地址(但即使这是实现细节)。但现代系统使用虚拟内存:操作系统为每个进程提供内存页面,并使用进程使用的虚拟地址与物理内存地址之间的映射。由于所有进程都是彼此的克隆(我假设在Linux或其他类Unix上使用fork),所有进程的虚拟内存地址都是相同的,而每个进程都指向一组不同的物理页面。
因此,每个进程在同一(虚拟)地址看到自己的列表副本,但它们仍然是存储在不同物理地址的不同副本。
如果要使用multiprocessing
模块在不同进程之间共享状态,可以使用共享内存multiprocessing.Value
或multiprocessing.Array
或multiprocessing.Manager
来保存列表和multiprocessing.Proxy
访问它。 reference doc.