python slice是共享内存吗_python共享内存实现进程通信

1.概述

共享内存可以说是最有用的进程间通信方式.两个不同的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.采用共享内存通信的一个显而易见的好处效率高,因为进程可以直接读写内存,而不需要任何数据的复制.对于向管道和消息队列等通信等方式,则需要在内核和用户空间进行四次的数据复制,而共享内存则只需要两次数据复制:一次从输入文件到共享内存区,另一个从共享内存区到输出文件.实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域.而是保持共享区域,知道通信完毕为止,这样,数据内容就一直保存在共享内存中,并没有写回文件.共享内存中的内容往往是在解除映射时才写回文件的.因此,采用共享内存的通信方式效率非常高.

mmap系统调用是的是的进程间通过映射同一个普通文件实现共享内存.普通文件被映射到进程地址空间后,进程可以向像访问普通内存一样对文件进行访问,不必再调用read,write等操作.与mmap系统调用配合使用的系统调用还有munmap,msync等. 实际上,mmap系统调用并不是完全为了用于共享内存而设计的.它本身提供了不同于一般对普通文件的访问方式,是进程可以像读写内存一样对普通文件操作.而Posix或System V的共享内存则是纯粹用于共享内存的,当然mmap实现共享内存也是主要应用之一.

2. python mmap模块详解

在python中,mmap.mmap()的函数实现在windows和linux上是不一样的,但实现api接口函数很相似,下面以mmap的windows实现为例说明:

mmap.mmap(fileno, length[, tagname[, access[, offset]]])

fileno:the file handle fileno, 文件描述符

length:共享内存的大小

tagname: 共享内存区域的名字,可以理解为id

access:

ACCESS_READ: 只能读,如果执行写操作,raises a TypeError exception

ACCESS_WRITE: 可读可写

ACCESS_COPY: 可读可写,但不更新到文件中去

函数列表

mmap.close() 断开映射关系

mmap.find(string[, start[, end]]):返回第一个string的索引,否则返回-1

mmap.move(dest, src, count): 移动count大小的内容从src到dest

mmap.read(num): 根据文件指针的位置兑取num个字节的内容,更新文件指针的位置

mmap.read_byte():读取当前字符,更新文件指针位置

mmap.readline():Returns a single line, starting at the current file position and up to the next newline.从当前位置到下一行位置的所有内容

mmap.resize(newsize):Resizes the map and the underlying file,改变映射内存与文件大小

mmap.rfind(string[, start[, end]]): 返回最后一个string的索引

mmap.seek(pos[, whence]): 设置文件指针的位置

mmap.size(): 返回共享内存的大小

mmap.tell():返回当前指针的位置

mmap.write(string):从当前指针位置开始写入string

mmap.write_byte(byte): Write the single-character string byte into memory at the current position of the file pointer; the file position is advanced by 1.

3.基于mmap和json实现内存共享

ObjectMmap继承自mmap,结合json实现python obj的共享

jsonwrite(obj): 将可json序列化的obj对象写入共享内存

jsonread_master():主进程获取内存内容

jsonread_follower(): 从进程获取内存内容

自定义的jsonmmap模块:

#!/usr/bin/python

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

import mmap

import json

class ObjectMmap(mmap.mmap):

def __init__(self, fileno=-1, length=1024, access=mmap.ACCESS_WRITE, tagname='share_mmap'):

super(ObjectMmap, self).__init__(self, fileno, length, access=access, tagname=tagname)

self.length = length

self.access = access

self.tagname = tagname

def jsonwrite(self, obj):

try:

self.obj = obj

obj_str = json.dumps(obj)

obj_len = len(obj_str)

content = str(obj_len) + ":" + obj_str

self.write(content)

self.contentbegin = len(str(obj_len)) + 1

self.contentend = self.tell()

self.contentlength = self.contentend - self.contentbegin

return True

except Exception, e:

return False

def jsonread_master(self):

try:

self.seek(self.contentbegin)

content = self.read(self.contentlength)

obj = json.loads(content)

self.obj = obj

return obj

except Exception, e:

if self.obj:

return self.obj

else:

return None

def jsonread_follower(self):

try:

index = self.find(":")

if index != -1:

head = self.read(index + 1)

contentlength = int(head[:-1])

content = self.read(contentlength)

obj = json.loads(content)

self.obj = obj

return obj

else:

return None

except Exception, e:

if self.obj:

return self.obj

else:

return None

4.举例

主进程:

#!/usr/bin/python

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

import mmap

from jsonmmap import ObjectMmap

import random

def main():

mm = ObjectMmap(-1, 1024*1024, access=mmap.ACCESS_WRITE, tagname='share_mmap')

while True:

length = random.randint(1, 100)

p = range(length)

mm.jsonwrite(p)

print '*' * 30

print mm.jsonread_master()

if __name__ == '__main__':

main()

从进程:

#!/usr/bin/python

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

import mmap

from jsonmmap import ObjectMmap

import time

def main():

mm = ObjectMmap(-1, 1024*1024, access=mmap.ACCESS_READ, tagname='share_mmap')

while True:

print '*' * 30

print mm.jsonread_follower()

if __name__ == '__main__':

main()

5.应用场景

主进程+多个从进程,主进程负责管理多个从进程,主从进程共享一个可序列化json对象,譬如说共享配置; 主进程才具备权限去修改配置,从进程仅仅具备访问权限。

import mmap

mmap_file = None

##从内存中读取信息,def read_mmap_info():

global mmap_file

mmap_file.seek(0)

##把二进制转换为字符串 info_str=mmap_file.read().translate(None, b'\x00').decode()

print(info_str)##如果内存中没有对应信息,则向内存中写信息以供下次调用使用def get_mmap_info():

global mmap_file

##第二个参数1024是设定的内存大小,单位:字节。如果内容较多,可以调大一点 mmap_file = mmap.mmap(-1, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')

##读取有效比特数,不包括空比特 cnt=mmap_file.read_byte()

if cnt==0:

print("Load data to memory")

mmap_file = mmap.mmap(0, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')

mmap_file.write(b"This is the test data")

else :

print("The data is in memory")

read_mmap_info()

##修改内存块中的数据def reset_mmp_info:

global mmap_file

mmap_file.seek(0)

mmap_file.write(b'\x00')

mmap_file.write(b"Load data to memory agine")

if __name__=="__main__":

get_mmap_info()

说明:如果是使用python自带的IDE,请重新打开一次此文件运行测试数据装载到内存后的结果

简单进程通信案例

#########################################################

#writer

import win32event as w32e

import mmapfile as mmf

#hEvent = w32e.OpenEvent(w32e.EVENT_ALL_ACCESS , 0 , "KaiMemEvent") #"Global\\JmdebuggerEvent"

pyMm = mmf.mmapfile(None , "KaiMem" ,1024)

hEvent = 1

if hEvent != None and pyMm != None:

#w32e.SetEvent(hEvent)

pyMm.write("hello world again!");

#############################################################

#reader

import win32event as w32e

import win32api as wapi

import mmapfile as mmf

#hEvent = w32e.CreateEvent(w32e.EVENT_ALL_ACCESS , 0 , 0 , "KaiMemEvent") #

#system_info=wapi.GetSystemInfo()

#page_size=system_info[1]

pyMm = mmf.mmapfile(None , "KaiMem" ,1024 )

hEvent = 1

if hEvent != None and pyMm != None :

#w32e.WaitForSingleObject(hEvent , -1)

buf = pyMm.read(22)

print buf

#wapi.CloseHandle(hEvent)

pyMm.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FCN-数据篇

从本篇开始,我们来记录一下全卷积网络用来做语义分割的全过程。 代码:https://github.com/shelhamer/fcn.berkeleyvision.org 下面我们将描述三方面的内容: 1. 官方提供的公开数据集 2. 自己的数据集如何准备,主要是如何标注…

深圳本地网店代运营公司

◆★◆深圳本地网店代运营,淘宝代运营多少钱,微博运营公司,代运营平台,天猫京东代运营,网站代运营图 片, 北京京东代运营,网店代运营协议,京东店铺代运营,网站代运营服务…

搜索专题题解

题目链接: codeforces 277A - Learning Languages 题目描述: 一个团体有n个人,每个人都掌握了一些语言,每个人学一门语言有1个花费,两个人之间可以通过其他人的翻译,问最少花费多少使得这个团体的任意两个人…

Facebook 开源的快速文本分类器 FastTex

FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。 fastText 原理fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。下面我们一一介绍。 1.1 模型架构 …

FCN-加载训练与测试数据

当我们生成了数据后,我们来看看FCN是如何加载数据的。 FCN 代码预览 其中: - data : 训练测试数据 - ilsvrc-nets:存放预训练的模型 - 剩下的框:不同数据集的训练测试prototxt - voc_layers,siftflow_layers等&am…

怎么撤销定时说说_已注册商标遇到撤三申请怎么办

很多企业的商标都遇到过商标撤三的情况,撤三简单的说就是,注册商标没有正当理由连续三年不使用的,任何单位或者个人可以向商标局申请撤销该注册商标。所以说,无论您的企业多大,商标持有的再多,也要做好商标…

windows下架设SVN服务器并设置开机启动

1、安装SVN服务器,到http://subversion.apache.org/packages.html上下载windows版的SVN,并安装,在命令行下运行svn命令,如下所以,则svn服务器安装成功。 C:\Documents and Settings\Administrator>svn 使用“svn …

Spartan-6 FPGA SelectIO Resources User Guide 笔记2 SelectIO Attributes/Constraints

1.Location Constraint 用于分配I/O端口 NET <I/O_NAME> LOC "<EXTERNAL_PORT_IDENTIFIER>"; Example: NET MY_IO LOCR7; 2.IOSTANDARD Attribute 用于选择IO标准如LVCMOS25&#xff0c;LVDS_25等 NET <I/O_NAME> IOSTANDARD”<IOSTANDARD V…

python合并pdf 加书签_Python生成pdf目录书签的实例方法

有时候我们用的一些pdf资料是没有目录的&#xff0c;这样找寻我们想到的东西比较麻烦。本篇文章就为大家带来python来生成pdf目录书签的方法。首先&#xff0c;我们需要下载一个软件FreePic2Pdf,利用它我们可以将我们的pdf文件导入书签工具下载&#xff1a;https://www.jb51.ne…

正则表达式及其在python上的应用

今天学习了一早上正则表达式。如下内容部分转载自《读懂正则表达式就这么简单》 一、什么是正则表达式 正则表达式是一种特殊的字符串模式&#xff0c;用于匹配一组字符串&#xff0c;就好比用模具做产品&#xff0c;而正则就是这个模具&#xff0c;定义一种规则去匹配符合规…

安全专家在硬盘固件中发现NSA的网络间谍程序

本周安全专家在硬盘固件中发现了美国国家安全局&#xff08;NSA&#xff09;的网络间谍程序&#xff0c;这些程序非常难以被检测或者删除。来自卡巴斯基的研究者公布了该恶意程序用来“Phone Home”的URL地址&#xff0c;NSA利用这些随机、凌乱的地址来收集硬盘上的敏感数据。 …

SVN 分支/合并/切换

本文无条理性&#xff0c;仅作自我参考。 花费了两个半下午&#xff0c;走马观花的看了一下说明文档&#xff0c;SVN设计的太复杂&#xff0c;对我这样的&#xff0c;不在一个集体的的业余开发者&#xff0c;要理解起来真是太难了。。。。 分支 Make branches as often as yo…

使用Firefox或Chrome的雇员表现更好不频繁跳槽

一家销售软件帮助雇主招募雇员和留住雇员的公司Cornerstone OnDemand称&#xff0c;使用非默认浏览器如Firefox或Chrome的雇员表现更好不频繁跳槽。 这项研究旨在帮助那些跳槽率过高的行业&#xff0c;比如呼叫中心的年跳槽率高达45%。对50000名在线工作评估参与者的数据进行分…

关于FCN的数据集着色说明

前方我们讲解了《 FCN-数据篇》。里面包含了如何制作类似pascal voc的label。很大篇幅在谈如何着色&#xff0c;如何转化为索引图像。 由于一些内容参考网上的资料&#xff0c;所以对里面的一些操作含义也有些糊涂。 其实网上的东西也不都对&#xff0c;很多人云亦云。所以需要…

mongobd python_Python操作MongoDB数据库PyMongo库使用方法

引用PyMongo复制代码 代码如下:>>> import pymongo创建连接Connection复制代码 代码如下:>>> import pymongo>>> conn pymongo.Connection(localhost,27017)或复制代码 代码如下:>>> from pymongo import Connection>>> conn C…

Android Property Animation动画

3.0以前&#xff0c;android支持两种动画模式&#xff0c;tween animation,frame animation&#xff0c;在android3.0中又引入了一个新的动画系统&#xff1a;property animation&#xff0c;这三种动画模式在SDK中被称为property animation,view animation,drawable animation…

angular实现select的ng-options

ng实现简单的select <div ng-controller"ngSelect"><select ng-model"vm.selectVal" ng-options"o.title for o in vm.optionsData"><option value"">请选择</option></select> </div> var app …

Ubuntu14.04下Mongodb数据库可视化工具安装部署步骤(图文详解)(博主推荐)

不多说&#xff0c;直接上干货&#xff01; 前期博客 Ubuntu14.04下Mongodb&#xff08;离线安装方式|非apt-get&#xff09;安装部署步骤&#xff08;图文详解&#xff09;&#xff08;博主推荐&#xff09; Ubuntu14.04下Mongodb官网安装部署步骤&#xff08;图文详解&#x…

deeplab运行指南

以下仅仅为一个总结&#xff0c;参考了网上的众多资料&#xff0c;仅备忘记。 主要链接 deeplab主页&#xff1a;http://liangchiehchen.com/projects/DeepLab.html官方代码&#xff1a;https://bitbucket.org/aquariusjay/deeplab-public-ver2python 版caffe实现&#xff1a…

tensorboard使用_colab打不开tensorboard的解决办法

2020.4.1更新&#xff1a;colab现在自带tensorboard的魔术方法了&#xff0c;用这个命令就能展示tensorboard%load_ext tensorboard %tensorboard --logdir ./log/train# 加载一次后&#xff0c;如果要重新加载&#xff0c;就需要使用reload方法 %reload_ext tensorboard %tens…