python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写
python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写
示例代码:
点击查看代码
import multiprocessing
def f(ns):
ns.x.append(1)
ns.y.append("a")
if __name__ == '__main__':
manger = multiprocessing.Manager()
ns = manger.Namespace()
ns.x = []
ns.y = []
p = multiprocessing.Process(target=f, args=(ns,))
p.start()
p.join()
print(ns.x)
print(ns.y)
该代码运行的结果并不是 [1] 和 ['a'],而是:

由此可见对跨主机的共享内存的修改并不能简单的直接操作,根据资料显示可知,manger下的共享内存仅仅能传播如manager.list()这样的可变对象,如果我们不使用该种写法,就必须在子进展中手动的实现对manger空间下的变量的赋值操作。
修改后的代码:
点击查看代码
import multiprocessing
"""
def f(ns):
ns.x.append(1)
ns.y.append("a")
if __name__ == '__main__':
manger = multiprocessing.Manager()
ns = manger.Namespace()
ns.x = []
ns.y = []
p = multiprocessing.Process(target=f, args=(ns,))
p.start()
p.join()
print(ns.x)
print(ns.y)
"""
def f(ns, x, y):
x.append(1)
y.append("a")
# ns.x = [11, 22, 33, [44, 55]]
# ns.x = 0
ns.x = x
ns.y = y
ns.z = 111
if __name__ == '__main__':
manger = multiprocessing.Manager()
ns = manger.Namespace()
ns.x = []
ns.y = []
p = multiprocessing.Process(target=f, args=(ns, ns.x, ns.y))
p.start()
p.join()
print(ns.x)
print(ns.y)
print(ns.z)
运行结果:

由此可见,在子进程中传入的manager实例及其命令空间下的变量其实在传参时是一种copy操作,而不是引用操作,因此在子进程中的任何操作并不会改变共享内存下的变量的,因此我们需要在子进程中手动的来对共享内存命令空间下的变量进行手动赋值。
为此我们可以进行一种更极端的编程代码:
点击查看代码
import multiprocessing
"""
def f(ns):
ns.x.append(1)
ns.y.append("a")
if __name__ == '__main__':
manger = multiprocessing.Manager()
ns = manger.Namespace()
ns.x = []
ns.y = []
p = multiprocessing.Process(target=f, args=(ns,))
p.start()
p.join()
print(ns.x)
print(ns.y)
"""
"""
def f(ns, x, y):
x.append(1)
y.append("a")
# ns.x = [11, 22, 33, [44, 55]]
# ns.x = 0
ns.x = x
ns.y = y
ns.z = 111
if __name__ == '__main__':
manger = multiprocessing.Manager()
ns = manger.Namespace()
ns.x = []
ns.y = []
p = multiprocessing.Process(target=f, args=(ns, ns.x, ns.y))
p.start()
p.join()
print(ns.x)
print(ns.y)
print(ns.z)
"""
import time
def f(ns, x, y):
for i in range(10):
x.append(i)
y.append(str(i))
ns.x = x
ns.y = y
time.sleep(1)
if __name__ == '__main__':
manger = multiprocessing.Manager()
ns = manger.Namespace()
ns.x = []
ns.y = []
p = multiprocessing.Process(target=f, args=(ns, ns.x, ns.y))
p.start()
for i in range(10):
print(ns.x)
print(ns.y)
time.sleep(1)
p.join()
print(ns.x)
print(ns.y)
运行效果:

本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2025-11-16 19:17 Angry_Panda 阅读(0) 评论(0) 收藏 举报
浙公网安备 33010602011771号