python多进程存储数据_[b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array...

1. Code

#-*- coding: utf-8 -*-

"""多进程 数据共享 共享变量 Value,Array

逻辑:

2个进程,对同一份数据,一个做加法,一个做加法,各做10次

总结:

1、入口代码 必须放在if __name__ == '__main__' 下,不然报错,不清楚为什么

用法:

1. 创建共享变量 o = Value('i',1000) or o = Array('i',list) 指定不同的类型

2. 启动子进程通过 o.value or o[i] 存取变量的值

3. 必要使用锁操作函数 o.acquire() o.release()

参考:

get_lock() 返回共享变量使用的Rlock 实例

get_obj() 返回共享变量数据类型"""

from multiprocessing importProcess,Value,Arrayimporttimeimportrandom#对共享变量加法

defsave_money(money):

money.acquire()#申请锁

for i in range(10):

time.sleep(0.3)

change= random.randint(1,200)

money.value+=changeprint "\n",money.value,change

money.release()#释放锁

#对共享变量减法

deftake_money(money):

money.acquire()for i in range(10):

time.sleep(0.5)

change= random.randint(1,150)

money.value-=changeprint "\n",money.value," ",-change

money.release()#修改共享变量数组

defsave_money2():

m.acquire()#申请锁

m[2] = 8

print [ i for i inm ]

m.release()#释放锁

#读取共享变量数组

deftake_money2():

m.acquire()#申请锁

print [ i for i inm ]

m.release()#释放锁

ifTrue:

m= Array('i',[1,2,3,4,5]) #放在main下面,就不是全局了

if __name__ == '__main__':#共享内存,可以多个进程存取,整型,变量名money,变量值1000

money = Value('i',1000)

d= Process(target=save_money, args=(money,))

d.start()

w= Process(target=take_money, args=(money,))

w.start()

d.join()

w.join()

Process(target=save_money2).start()

Process(target=take_money2).start()print "end"

Out:

995 -5

892 -103

814 -78

694 -120

668 -26

550 -118

482 -68

423 -59

293 -130

188 -105

193 5

325 132

473 148

535 62

539 4

677 138

738 61

875 137

1066 191

1231 165end

[1, 2, 8, 4, 5]

[1, 2, 3, 4, 5]

View Code

2 资料

https://www.cnblogs.com/gengyi/p/8661235.html

基本特点:

(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。

(2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。(文件映射)

(3)由于多个进程共享一段内存,因此也需要依靠某种同步机制。

优缺点:

优点:快速在进程间传递数据

缺点: 数据安全上存在风险,内存中的内容会被其他进程覆盖或 者篡改

注: 经常和同步互斥配合使用

Value:将一个值存放在内存中,

Array:将多个数据存放在内存中,但要求数据类型一致

Value

注:Value('h',1)  = Value(c_short,1)

Array

Array(typecode_or_type, size_or_initializer, *, lock=True)

使用基本类似于Value,Returns a synchronized shared array

typecode_or_type:定义转换成C语言的存储类型;

size_or_initializer:如果它是一个整数,那么它确定数组的长度,并且数组将被初始化为零。否则,size_or_initializer是用于初始化数组的序列,其长度决定数组的长度

lock : lock为True,则会创建一个新的锁对象,以同步对该值的访问。如果lock是Lock或RLock对象,那么它将用于同步对该值的访问。如果lock是False,那么对返回的对象的访问不会被锁自动保护,因此它不一定是“进程安全的”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值