在内存中开辟一块空间,进程可以写入内容和读取内容完成通信,但是每次写入内容会覆盖之前内容(每次从首地址操作),不能同时保留多次内容,只能存一个内容。
效率最高的通信方案
只能存放一个数据
每一次的写入都从地址某一个固定的起始位置开始并覆盖原内容
from multiprocessing import Value,Array
#1. value() 存一个值
#开辟共享内存空间
#ctype 声明共享内存空间类型 'i'(整型) 'f'(浮点型) 'c'(字节串),声明后只能放该类型的数据
#data 共享内存空间初始数据(数据类型与ctype保持一致)
obj = Value(ctype,data)
#读写共享内存:对该属性的修改就是对共享内存的修改,共享内存只能有一个值
obj.value
#array() 数组,存一组值(只能存字节串(或者字符串)和列表,因为是c语言中来的)
#开辟共享内存空间
#ctype 表示共享内存数据类型
#data 整数则表示开辟空间的大小,其他数据类型表示开辟空间存放的初始化数据:e.g. [1,2,3]
obj = Array(ctype,data)
#读写
通过遍历obj可以得到每个值,直接可以通过索引序号修改任意值
from multiprocessing import Process,value
import time
from random import randint
#创建共享内存,声明整型,初始值5000
money = Value('i',5000)
#操作内存
def man():
for i in range(30):
time.sleep(0.2)
money.value += randint(1,1000)
#操作共享内存
def girl():
for i inrange(30):
time.sleep(0.15)
money.value -= randint(100,800)
p1 = Process(target=man)
p2 = Process(target=girl)
p1.start()
p2.start()
p1.join()
p2.join()
print('一个月余额:‘,money.value)
from multiprocessing import Process,Array
#创建共享内存空间,声明类型为整型,初始值为[1,2,3,4,5]
shm = Array('i',[1,2,3,4,5]
def fun():
#迭代读取共享内存中的值,且只能通过for循环一个个取出
for i in shm:
print(i)
#在子进程中修改共享内存中的值
shm[1] = 8888
p = Process(target=fun)
p.start()
p.join()
#在父进程中查看值,实现进程间通信
for i in shm:
print(i)