###1.概述python
共享内存能够说是最有用的进程间通讯方式.两个不用的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程能够及时看到另外一个进程对共享内存的更新,反之亦然.采用共享内存通讯的一个显而易见的好处效率高,由于进程能够直接读写内存,而不须要任何数据的复制.对于向管道和消息队列等通讯等方式,则须要在内核和用户空间进行四次的数据复制,而共享内存则只须要两次数据复制:一次从输入文件到共享内存区,另外一个从共享内存区到输出文件.实际上,进程之间在共享内存时,并不老是读写少许数据后就解除映射,有新的通讯时,再从新创建共享内存区域.而是保持共享区域,知道通讯完毕为止,这样,数据内容就一直保存在共享内存中,并无写回文件.共享内存中的内容每每是在解除映射时才写回文件的.所以,采用共享内存的通讯方式效率很是高.linux
mmap系统调用是的是的进程间经过映射同一个普通文件实现共享内存.普通文件被映射到进程地址空间后,进程能够向像访问普通内存同样对文件进行访问,没必要再调用read,write等操做.与mmap系统调用配合使用的系统调用还有munmap,msync等. 实际上,mmap系统调用并非彻底为了用于共享内存而设计的.它自己提供了不一样于通常对普通文件的访问方式,是进程能够像读写内存同样对普通文件操做.而Posix或System V的共享内存则是纯粹用于共享内存的,固然mmap实现共享内存也是主要应用之一.git
###2. python mmap模块详解github
在python中,mmap.mmap()的函数实如今windows和linux上是不同的,但实现api接口函数很类似,下面以mmap的windows实现为例说明:json
mmap.mmap(fileno, length[, tagname[, access[, offset]]])windows
函数列表api
###3.基于mmap和json实现内存共享dom
ObjectMmap继承自mmap,结合json实现python obj的共享函数
自定义的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 self.seek(0) 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: self.seek(0) 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
主进程:
#!/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()
主进程+多个从进程,主进程负责管理多个从进程,主从进程共享一个可序列化json对象,譬如说共享配置; 主进程才具有权限去修改配置,从进程仅仅具有访问权限。
详情请参见dragondjf github