1 共享内存
基本特点:
(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。
(2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。(文件映射)
(3)由于多个进程共享一段内存,因此也需要依靠某种同步机制。
优缺点:
优点:快速在进程间传递数据
缺点: 数据安全上存在风险,内存中的内容会被其他进程覆盖或 者篡改
注: 经常和同步互斥配合使用
2 基本语法
共享内存要符合C语言的使用语法
from multiprocessing import Value , Array
Value:将一个值存放在内存中,
Array:将多个数据存放在内存中,但要求数据类型一致
补充:数据类型
Type codeC TypePython TypeMinimum size in bytesNotes
‘b‘
signed char
int
1
‘B‘
unsigned char
int
1
‘u‘
Py_UNICODE
Unicode character
2
(1)
‘h‘
signed short
int
2
‘H‘
unsigned short
int
2
‘i‘
signed int
int
2
‘I‘
unsigned int
int
2
‘l‘
signed long
int
4
‘L‘
unsigned long
int
4
‘q‘
signed long long
int
8
(2)
‘Q‘
unsigned long long
int
8
(2)
‘f‘
float
float
4
‘d‘
double
float
8
2.1 Value
Value(typecode_or_type, *args, lock=True)
功能 : 得到一个共享内存对象,并且存入初始值,method of multiprocessing
返回Returns a synchronized shared object(同步共享对象)
typecode_or_type:定义了返回类型(转换成C语言中存储类型),它要么是一个ctypes类型,要么是一个代表ctypes类型的code。
*args:开辟一个空间,并赋一个args值,值得类型不限
注:ctypes是python的一个外部函数库,它提供了和C语言兼容的数据类型,可以调用DLLs或共享库的函数,能被用作在python中包裹这些库。
from multiprocessing importProcess,Valueimporttimeimportrandomdefsave_money(money):for i in range(100):
time.sleep(0.1)
money.value+= random.randint(1,200)deftake_money(money):for i in range(100):
time.sleep(0.1)
money.value-= random.randint(1,150)#money为共享内存对象,给他一个初始值2000,类型为正型“i”#相当于开辟了一个空间,同时绑定值2000,
money = Value(‘i‘,2000)
d= Process(target=save_money,args=(money,))#这里面money是全局的,不写也可
d.start()
w= Process(target=take_money,args=(money,))#这里面money是全局的,不写也可
w.start()
d.join()
w.join()print(money.value)
运行 4491
2.2 Array
Array(typecode_or_type, size_or_initializer, *, lock=True)
使用基本类似于Value,Returns a synchronized shared array
typecode_or_type:定义转换成C语言的存储类型;
size_or_initializer:初始化共享内存空间,
若为数字,表示开辟的共享内存中的空间大小,(Value表示为该空间绑定一个数值)
若为数组,表示在共享内存中存入数组
from multiprocessing importProcess,Arraydeffun(m,n):for i inrange(n):print(m[i])#此处不表数字8类型为整型‘i‘;#表示开辟8个空间,且均为整型i,其实就是一个列表
m = Array(‘i‘,3)
p= Process(target= fun,args=(m,4))
p.start()
p.join()
运行
0 0 0
Process Process-1:
....
IndexError: invalid index
说明:三个0表示开辟的共享内存容量为3,当再超过3时就会报错。
示例2
from multiprocessing importProcess,Arrayimporttimedeffun(m,n):for i inrange(n):
m[i]=i
m= Array(‘i‘,5)
p= Process(target= fun,args=(m,5))
p.start()
time.sleep(1)for i inm:print(i)
p.join()
运行结果
01 2 3 4
如果将 time.sleep(1) 去掉,则输出结果均为0,原因就是还未赋值就已经打印了。
from multiprocessing importProcess,Arrayimporttimedeffun(m,n):for i inrange(n):print(m[i])
m[i]=i#此处表示开辟5个空间,同时存入列表中的元素
m = Array(‘i‘,[1,2,3,4,5])
p= Process(target= fun,args=(m,5))
p.start()
time.sleep(1)for i inm:print(i)
p.join()
运行
1 2 3 4 501 2 3 4
第二个参数如果传入一个数字,则表示在共享内存中开辟多大的空间,
如果传入的是列表,则开辟响应元素数量的共享空间容量,并将其直接存入共享空间