前言:
目前我们对“python操作内存地址”大概比较注重,兄弟们都想要学习一些“python操作内存地址”的相关知识。那么小编也在网上网罗了一些关于“python操作内存地址””的相关资讯,希望兄弟们能喜欢,看官们一起来了解一下吧!主要内容:小目标:掌握进程间通信方式主要内容:共享内存
一个问题:有没有一种方式,多个进程可以同时访问修改同一个变量?
回到:有的,共享内存;
共享内存:
多个进程可以直接读写一块公共内存,不需要数据拷贝。
实现原理:
为了在多个进程间交换信息,内核提供一种映射机制;
多个进程就可以直接读写一块公共内存地址而不需要进行数据的拷贝;
优点:速度快,使用方便缺点:同步问题1.Python中的共享内存对象:Value与ArrayValue与Array:
from multiprocessing import Value , Array Value:Value(typecode_or_type, *args, lock=True)Array:Array(typecode_or_type, size_or_initializer, *, lock=True)typecode_or_type:遵循C语言数据格式数据类型如下:
2. 基本操作:
Value:
#Value对象val = Value('i', 10)#读取val值print(val.value)#设置val值val.value = 20print(val.value)
结果:10,20
Array:
#Array对象, args为typecode类型的可迭代对象alist = Array('i', [1,2,3,4])#访问:print('alist[1]:', alist[1])#遍历:for val in alist: print(val)
结果:
alist[1]: 212343. 多进程共享内存案例3.1 两个进程对Value进行操作:
子进程修改Value值,看下父进程中变化:
import multiprocessingfrom multiprocessing import Queuefrom multiprocessing import Value, Arrayg_value = Value('i', 0)#进程函数, 共享内存必须通过参数传入def func(gvalue): #修改g_value值 gvalue.value = 10if __name__ == "__main__": print("g_value init value:", g_value.value) #全局消息队列 main_msgq = Queue() #消息队列必须通过参数传入到子进程,否则无效 p = multiprocessing.Process(target=func, args=(g_value,)) p.start() p.join() print("g_value end value:", g_value.value)
结果:
g_value init value: 0g_value end value: 103.2 两个进程同时对Value修改
一个例子:
两个进程对Value对象进行操作,初始值为0;
主进程对Value对象加100000次,子进程减100000次,查看最后的值是否为0;
代码如下:
import multiprocessingfrom multiprocessing import Queuefrom multiprocessing import Value, Arrayg_value = Value('i', 0)#进程函数, 共享内存必须通过参数传入def func(gvalue): i = 0 while i < 100000: #加1 gvalue.value += 1 i += 1 if __name__ == "__main__": print("g_value init value:", g_value.value) #全局消息队列 main_msgq = Queue() #消息队列必须通过参数传入到子进程,否则无效 p = multiprocessing.Process(target=func, args=(g_value,)) p.start() i = 0 while i < 100000: #减1 g_value.value -= 1 i += 1 p.join() print("g_value end value:", g_value.value)
尝试多运行几次,会有这样结果:
g_value init value: 0g_value end value: 2735
分析:
理论上,一个变量同时加减一样次数,值应该不变;
多进程操作为什么会出现这个问题?
两个进程同时对变量gvalue进行操作,就会造成这个问题;
如何来处理? 下一节我们来看下并发编程的同步机制。