当前位置: 首页 > news >正文

python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写

python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写

python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写



示例代码:

点击查看代码
import multiprocessingdef 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'],而是:

image


由此可见对跨主机的共享内存的修改并不能简单的直接操作,根据资料显示可知,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 = 0ns.x = xns.y = yns.z = 111if __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)

运行结果:

image


由此可见,在子进程中传入的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 = 0ns.x = xns.y = yns.z = 111if __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 = xns.y = ytime.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)

运行效果:

image