版权所有,转载请注明出处:http://guangboo.org/2013/03/22/python-mmap-share-memory
进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等,本文使用python模块mmap做一个进程间通讯的演示。
mmap模块支持windows和Unix系统,但有差别,针对不同的操作系统提供不同的构造函数,本文在windows环境下进行。因此只介绍windows下如何使用共享内存进行进程间通讯的。
windows下的共享内存是可以进行命名的,并且该共享内存在当前环境下所有进程都是可以访问。windows下mmap的构造函数声明如下:
class mmap.mmap(fileno, length[, tagname[, access[, offset]]])
fileno参数表上映射的文件,如果是共享内存的话,该参数传递-1,length参数表上内存的大小,我们的实例是1024(1K)。tagname参数就是共享内存的名称了,为了在其他进程中能够共享该内存,因此这里命名为“share_mmap”,access参数用于限制对共享内存的访问,其取值为ACCESS_READ, ACCESS_WRITE和ACCESS_COPY的一个,offset表示内存偏移量。
本文的实例,创建两个应用程序,一个用于往共享内存中写一些字符串,另一个进程读取共享内存中的内容。为了方便,这里使用Tkinter Gui框架,因为这是python内置的,不需要安装第三方的GUI库,如QT或wxPython等。代码如下是写共享内存的应用程序:
# write_app.py
import mmap
from Tkinter import *
class WriteApp:
mmap_file = None
def __init__(self, master):
self.master = master
self.master.title('mmap demo')
frm = Frame(self.master)
frm.pack()
self.open_button = Button(frm, text = 'Create a mmap', command = self.create_mmap)
self.open_button.pack(side = LEFT)
self.close_button = Button(frm, text = 'Close a mmap', state = DISABLED, command = self.close_mmap)
self.close_button.pack(side = LEFT)
self.text = Entry(frm)
self.text.pack(side = BOTTOM)
self.text.bind('', self.write_text)
self.text.config(state = DISABLED)
def create_mmap(self):
self.mmap_file = mmap.mmap(0, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')
self.close_button.config(state = ACTIVE)
self.open_button.config(state = DISABLED)
self.text.config(state = NORMAL)
def close_mmap(self):
self.close_button.config(state = DISABLED)
self.open_button.config(state = ACTIVE)
self.text.config(state = DISABLED)
self.mmap_file.close()
def write_text(self, event):
txt = self.text.get()
self.mmap_file.write(txt)
self.text.delete(0, len(txt))
if __name__ == '__main__':
root = Tk()
app = WriteApp(root)
root.mainloop()
将以上代码保存到write_app.py文件中,运行,可以看到如下效果:
点击“Create a mmap”创建名称为“share_mmap”的共享内存,然后在右边的输入框中输入“hello world!”,然后“回车”,那么“hello world!”这句话即被写入共享内存中了。
为了能从另一个进程中查看共享内存中的数据,下面一个ReadApp用于演示从“share_mmap”共享内存中读取数据,将以下代码保证到read_app.py文件中:
# read_app.py
import mmap
class ReadApp:
mmap_file = None
def __init__(self, master):
self.master = master
self.master.title('read mmap')
frm = Frame(self.master)
frm.pack()
self.refresh_button = Button(frm, text = 'Refresh mmap content', command = self.refresh_mmap)
self.refresh_button.pack(side = TOP)
self.text_variable = StringVar()
self.text = Label(frm, textvariable = self.text_variable)
self.text.pack(side = BOTTOM)
def refresh_mmap(self):
if not self.mmap_file:
self.mmap_file = mmap.mmap(-1, 1024, access = mmap.ACCESS_READ, tagname = 'share_mmap')
self.mmap_file.seek(0)
self.text_variable.set(self.mmap_file.readline())
if __name__ == '__main__':
root = Tk()
app = ReadApp(root)
root.mainloop()
运行read_app.py文件,然后点击“Refresh mmap content”的按钮,就会看到按钮下发出现“hello world!”,该数据就是从共享内存中读取的。如下效果:
本文中的代码整理到一个文件share_mm_demo.py中,运行时可以通过命令行share_mm_demo.py运行写内存的进程,通过命令行share_mm_demo.py read运行读内存的程序。
分享到:
相关推荐
使用Windows共享内存技术 实现Python与C_C++程序间的数据传递.pdf
Python的共享内存队列使用示例
Python_multiprocessing_6_共享内存_shared_memory_(多进程_多核运算_教学教程tutori
前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现。查了一下,Python中可以使用mmap模块来实现...
OSX | Linux | 节点4.1-14.x,Python2 / 3:|扩展内存语义(EMS) EMS使Node.js,Python和C / C ++之间的持久共享内存并行性成为可能。 扩展内存语义(EMS)统一了同步和存储原语,以解决并行编程的若干挑战: 允许...
1、Docker简介、 2、Docker安装、 3、Docker常用命令、 4、Docker镜像、 5、Docker容器数据卷、 6、DockerFile解析、 7、Docker常用安装、 8、本地镜像发布到阿里云、
python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现 流程 C++共享内存打包成库 python调用C++库往共享内存存图像数据 C++测试代码从共享内存读取图像数据 实现 1.c++打包库 创建文件 example...
使用Windows共享内存技术 实现Python与C_C++程序间的数据传递
两个控制台,一个动态库,加载后AB共享内存,可在IO线程中收发消息。这只是一个简单的demo,使用IPC中data_seg。
py_boost_shmem 在boost :: interprocess和Python的mmap之间映射共享内存的示例。 我在将python(使用mmap模块)中的共享内存连接到使用boost :: interprocess创建的C ++中的共享内存时遇到问题。 我开始工作了,想...
共享内存区 一个非常简单的字典实现。 要求:Python> = 3.8 >> from shared_memory_dict import SharedMemoryDict >> smd = SharedMemoryDict ( name = 'tokens' , size = 1024 ) >> smd [ 'some-key' ] = 'some-...
python-3.8.8(32位64位)安装包 ... 现在,在正式的Beta版本中可用,Python 3.8带来了许多巧妙的语法更改,内存共享,更有效的序列化和反序列化,改进的字典等等。 自然地,Python 3.8也带来了各种性能改进。
从三个方面来说,主要有方面的措施:对象的引用计数机制、垃圾回收机制、内存池机制。...对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。 二、垃圾回收 1、当一个对象的引
multiprocessing 现在可以使用共享内存段来避免进程之间的酸洗成本 typed_ast 被合并回CPython LOAD_GLOBAL 现在快40% pickle 现在默认使用协议4,提高了性能 还有许多其他有趣的更改,请查阅文档中的“新增功能”...
生产者(lang = Python)将文件内容写入共享内存区域 使用者(lang = C)读取共享内存区域并写入文件 程序使用2个共享内存区域:一个用于内容大小,另一个用于内容本身 选择检查MD5哈希 安装 安装软件包:python2.7...
Python 3.8更新内容: PEP 572, 赋值表达式 ... 现在,多处理(multiprocessing)可以使用共享内存段 typed_ast 合并回 CPython LOAD_GLOBAL 现在快了 40% pickle 现在默认使用协议 4,提高了性能。
变量名和对象,在运行赋值语句b = a之后,变量a,b都指向了对象3的内存空间.假设这时执行 a = ‘python’, a将指向刚创建的字符串对象。我们再来试试这种情况: 复制代码 代码如下:>>>list_1 = [1,2,3,4]>>>list_2 = ...