python slice是共享内存吗_python学习笔记——多进程中共享内存Value & Array

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

第二个参数如果传入一个数字,则表示在共享内存中开辟多大的空间,

如果传入的是列表,则开辟响应元素数量的共享空间容量,并将其直接存入共享空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值