python学习笔记——多进程中共享内存Value & Array
1 共享内存
基本特点:
(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。
(2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。(文件映射)
(3)由于多个进程共享一段内存,因此也需要依靠某种同步机制。
优缺点:
优点:快速在进程间传递数据
缺点: 数据安全上存在风险,内存中的内容会被其他进程覆盖或 者篡改
注: 经常和同步互斥配合使用
2 基本语法
共享内存要符合C语言的使用语法
from multiprocessing import Value , Array
Value:将一个值存放在内存中,
Array:将多个数据存放在内存中,但要求数据类型一致
补充:数据类型
| Type code | C Type | Python Type | Minimum size in bytes | Notes |
|---|---|---|---|---|
'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 |
具体参考:8.7. array — Efficient arrays of numeric values
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 import Process,Value
import time
import random
def save_money(money):
for i in range(100):
time.sleep(0.1)
money.value += random.randint(1,200)
def take_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 import Process,Array
def fun(m,n):
for i in range(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 import Process,Array
import time
def fun(m,n):
for i in range(n):
m[i]=i
m = Array('i',5)
p = Process(target= fun,args=(m,5))
p.start()
time.sleep(1)
for i in m:
print(i)
p.join()
运行结果
0 1 2 3 4
如果将 time.sleep(1) 去掉,则输出结果均为0,原因就是还未赋值就已经打印了。
from multiprocessing import Process,Array
import time
def fun(m,n):
for i in range(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 in m:
print(i)
p.join()
运行
1 2 3 4 5 0 1 2 3 4
第二个参数如果传入一个数字,则表示在共享内存中开辟多大的空间,
如果传入的是列表,则开辟响应元素数量的共享空间容量,并将其直接存入共享空间
python学习笔记——多进程中共享内存Value & Array的更多相关文章
- python学习笔记——多进程中的锁Lock
1 进程锁 python编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一线程访问对象. 在python中我 ...
- python学习笔记—— 多进程中的 孤儿进程和僵尸进程
1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...
- Python 学习笔记 多进程 multiprocessing--转载
本文链接地址 http://quqiuzhu.com/2016/python-multiprocessing/ Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时 ...
- python 学习笔记 多进程
要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两 ...
- python学习笔记-多进程
multiprocessing from multiprocessing import Process import time def f(name): time.sleep(2) print('he ...
- Python学习笔记6-Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- python学习笔记——多进程一 基础概念
1 进程 进程:程序的一次(从开始到结束)执行过程,属于一个动态过程.是系统进行资源分配和调度的基本单位. 程序:指的是一个文件,磁盘中可执行的代码.属于一个静态文件 注:进程运行时需要把程序加载如内 ...
- python学习笔记——爬虫中提取网页中的信息
1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...
- python学习笔记——多进程二 进程的退出
1 进程的退出函数的基础语法 1.1 进程的退出函数 进程的退出含有有os._exit([status])和sys.exit([status])两种,从数据包来看,该退出模块仅在linux或者unix ...
随机推荐
- Android -- ViewPager、Fragment、状态保存、通信
工程架构 TabAFm到Tab ...
- Style 的查找 FindResource
1)根据名称查找 PrintPreview fe = new PrintPreview(new Summary()); string strResourceHeader = "headerS ...
- (https专业版)2018年1月5日高仿互站仿友价T5虚拟交易+实物交易商城-站长交易源码送手机版程序10套模版+首页微信登陆+头部下拉导航
(https专业版)2018年1月5日高仿互站仿友价T5虚拟交易+实物交易商城-站长交易源码送手机版程序10套模版+首页微信登陆+头部下拉导航 首页支持微信登陆,只有第8套模板支持(endv模板),后 ...
- Linux:su和su-的区别
大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -. 如上图所示,一 ...
- 深夜闲聊节目:华为 Mate7的指纹识别安全么?
许久没有写过不论什么东西,近期非常忙并且还要准备找工作之类的,唉... ....今天的文章也不说技术,仅仅是闲聊. 一.手机指纹识别一揽 打开非常多站点.论坛的科技栏目,充斥着各种手机讯息!仿佛手机已 ...
- HTML一(简介)
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- ssh2的application.xml配置文件配置详解
ssh2的application.xml配置文件配置详解 1.导入其他的配置文件.在ssh项目中可以导入其他的配置文件,导入的格式为: <import resource="clas ...
- TFS2012强制解除迁出(数据库操作方式)
同事离职,有个文件被迁出,查了好多资料终于解决. 在数据库中找到对应项目名字的数据库,例如Tfs_Project,记得先备份,保证删错了也能恢复~ 然后施行下列sql语句: --找到项目所在库 use ...
- HTML的GET方法传递参数样式。
#HTML的GET方法传递参数样式.http://127.0.0.1:8080/web1/urlinfo/getobject.html?UserId=1&UserName=ad
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍
参考于:http://blog.csdn.net/tianlesoftware/article/details/6009110 目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC ...