python 共享内存 c_python共享内存 - DK's Blog - 博客园
共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化。
共享内存是进程间最快速的通信方式:
`进程共享同一块内存空间。
`访问共享内存和访问私有内存一样快。
`不需要系统调用和内核入口。
`不造成不必要的内存复制。
内核不对共享内存的访问进行同步,因此程序员必须自己提供同步。
使用共享内存:
`某个进程分配内存段。
`使用这个内存段的进程要连接(attach)这个内存段。
`每个进程使用完共享内存段后,要分离(detach)这个内存段。
`在某个地方,必须有一个进程来销毁这个内存段。
Linux的内存模型:
`每个进程的虚拟内存被分为页(page)。
`每个进程维护自己的内存地址到虚拟内存页之间的映射。
`实际的数据存在于进程的内存地址上。
`尽管每个进程有自己的地址空间,多个进程的映射还是可以指向相同的页。
所有的共享内存段的大小,都是Linux内存页大小的整数倍。
Linux的页大小是4KB,不过程序员应该使用getpagesize函数来获得这个值。
分配:shmget
`第一个参数是一个整型的键,用于指定要创建的段。无关的进程可以通过指定同一个键来访问同一段共享内存。
`使用常量IPC_PRIVATE作为第一个参数,可以避免键的冲突。
`第二个参数是分配的段的大小(字节数)。实际分配的字节数会舍弃多余部分到页大小的整数倍。
`第三个参数是位标志,用来表示创建的选项。
``IPC_CREATE:表明要创建新的共享内存空间。
``IPC_EXCL:总是和上一个标志一起使用。如果指定键的共享内存段已经存在,这个标志会导致调用失败;如果没有指定这个标志,调用会返回已经占用这个键的共享内存段。
``模式标志:9个bit的标志,和系统的文件权限使用相同的标志,不过执行标志无效。这些标志定义在中。
`返回值是新创建的或者取得的内存段的标志符(SHMID)。
连接:shmat
`第一个参数是由shmget得到的标志符(SHMID)。
`第二个参数是指向你想要映射到的本进程的地址空间的指针。如果指定NULL,Linux负责选择一个可用的地址。
===================================================
python的共享内存
python的multiprocessing模块提供两种共享内存,sharedctypes与Manager,
Manager效率较低,但支持远程共享内存。
sharedctypes效率较高,快Manager两个数量级,在多进程访问时与普通内存访问相当
结果比较如下:
test array
elapsed 0:00:00.119707
test dict
elapsed 0:00:00.152856
test shared manager list
elapsed 0:00:37.87666
test sharedctypes list in main process
elapsed 0:00:00.154170
test sharedctypes list in subprocess
elapsed 0:00:00.303328
elapsed 0:00:00.327261
elapsed 0:00:00.349312
elapsed 0:00:00.318946
elapsed 0:00:00.364301
elapsed 0:00:00.370176
elapsed 0:00:00.343588
elapsed 0:00:00.348737
代码如下:
import array
from datetime import datetime, timedelta
size = 1000000
def tranverse(a):
t = datetime.now()
for i in range(size):
a[i]
print 'elapsed %s'% (datetime.now()- t)
a = array.array('i', [i for i in range(size)])
print 'test array'
tranverse(a)
a = {}
for i in range(size):
a[i] = i
print 'test dict'
tranverse(a)
from multiprocessing import Manager
manager = Manager()
a = manager.list([i for i in range(size)])
print 'test shared manager list'
tranverse(a)
from multiprocessing.sharedctypes import RawArray
a = RawArray( 'i', [i for i in range(size)] )
print 'test sharedctypes list in main process'
tranverse(a)
from multiprocessing import Process
ps = [Process(target=tranverse, args=(a, )) for i in range(8)]
print 'test sharedctypes list in subprocess'
for p in ps:
p.start()
for p in ps:
p.join()
python 共享内存 c_python共享内存 - DK's Blog - 博客园相关推荐
- python贴吧发帖脚本-一个发布文章到博客园的 Python 脚本
我的个人独立博客是基于 Hexo 搭建的,因为小站,Google 搜索引擎收录文章比较慢,还搜不到 为了解决这个问题,希望把文章也顺便发布到博客平台博客园上.但不想每次手动复制粘贴,打算利用脚本实现, ...
- python密码破解工具_一个最简单的博客园文章密码暴力破解器-python3实现
一个最简单的博客园文章密码暴力破解器-python3实现 我之前想写路由器的密码暴力破解器,我手上只有极路由,发现极路由有安全限制,只能允许连续10密码错误,所以我改拿博客园练手. 博客园的博客有个功 ...
- csv是python内置模块吗_Python--CSV模块 - 一只小小的寄居蟹 - 博客园
import csv with open('/etc/passwd', 'r') as f: reader = csv.reader(f, delimiter=':', quoting=csv.QUO ...
- python函数参数定义不合法_面试题 - Operater - 博客园
1.执行这行代码结果是多少[i**i for i in range(3)] 我写的答案是[0,1,3],忘记了0**0是1 [1,1,3] 2.关于python内存管理:变量可以无需指定类型,可以使用 ...
- python关于通讯录模型_python写一个通讯录 - wtwexile - 博客园
python写一个通讯录 闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 1 import j ...
- python爬虫抢演唱会_Python爬虫爬了七天七夜终于爬出了博客园粉丝数排行榜
Python爬虫爬了七天七夜终于爬出了博客园粉丝数排行榜 [Python爬虫]爬了七天七夜,终于爬出了博客园粉丝数排行榜! 爬虫数据采集接单,大小不限,欢迎各位科研教师,学生,企业相关人员咨询,QQ: ...
- 限制会话id服务端不共享_会话控制 - able-woman - 博客园
会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段.而会话,就是用户通过浏览器和服务器的一次通话. 为什么要有会话控制? 因为HTTP协议是无状态的,服务器不知道用户上一次做 ...
- Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园
Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园 Linux系统内存管理之伙伴系统分析 今天去面试,一位面试官提到了内存管理的伙伴系统,当时就懵了,因为根本就没有听说过.晚上回来在实验 ...
- 分布式Session共享(二):tomcat+memcached实现session共享 - 萝卜兔子 - 博客园
分布式Session共享(二):tomcat+memcached实现session共享 - 萝卜兔子 - 博客园 http://www.cnblogs.com/notDog/p/5341219.htm ...
最新文章
- hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询
- 在实际案例(费用系统)中落地DDD
- 浅谈2D游戏设计模式--游戏剧情设计(1)
- 使用 OSC Maven 第三方仓库
- sqlplus远程连接k8s集群部署的oracle
- 一个创业者的妥协与希望
- matlab之norm函数
- 内连接(INNER JOIN)
- java web开发技术大_2021年六大javaweb开发主流技术
- startlogging中设置setstdout=false来禁用这个功能。_Windows 10禁用USB选择性暂停设置,峰哥教你解决USB设备失灵问题...
- Vue 实践过程中的几个问题
- js prototype 原型对象
- 封面型网页html,网站设计常用网页版式
- caffe中各种loss函数
- 录屏软件 OBS 入门笔记
- 微信小程序云开发:使用cms平台来创建json数组
- supervisor安装
- TypeScript中any、unknown、void、never类型讲解
- Linux下装无线网卡(Ubuntu)
- PAT A1062 Talent and Virtue (25分)