`
xiaoheliushuiya
  • 浏览: 409785 次
文章分类
社区版块
存档分类
最新评论

python共享内存

 
阅读更多

版权所有,转载请注明出处: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文件中,运行,可以看到如下效果:

python mmap demopython mmap demo

点击“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!”,该数据就是从共享内存中读取的。如下效果:

python mmap demo

本文中的代码整理到一个文件share_mm_demo.py中,运行时可以通过命令行share_mm_demo.py运行写内存的进程,通过命令行share_mm_demo.py read运行读内存的程序。

分享到:
评论

相关推荐

    linux python共享内存

    在 Python 中,可以使用 multiprocessing 模块来实现共享内存。下面是一个简单的示例,演示如何在 Python 中使用 multiprocessing 来创建共享内存,以及如何在多个进程之间共享数据。 在这个示例中,我们使用 Value ...

    使用Windows共享内存技术 实现Python与C_C++程序间的数据传递.pdf

    使用Windows共享内存技术 实现Python与C_C++程序间的数据传递.pdf

    Python的共享内存队列使用示例

    Python的共享内存队列使用示例

    Python multiprocessing 6 共享内存 shared memory (多进程 多核运算 教学教程tutorial)

    Python_multiprocessing_6_共享内存_shared_memory_(多进程_多核运算_教学教程tutori

    python和C++共享内存传输图像的示例

    python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现 流程 C++共享内存打包成库 python调用C++库往共享内存存图像数据 C++测试代码从共享内存读取图像数据 实现 1.c++打包库 创建文件 example...

    Python进程间通信之共享内存详解

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现。查了一下,Python中可以使用mmap模块来实现...

    ems:扩展内存语义-Node.js和Python的持久共享对象内存和并行性

    OSX | Linux | 节点4.1-14.x,Python2 / 3:|扩展内存语义(EMS) EMS使Node.js,Python和C / C ++之间的持久共享内存并行性成为可能。 扩展内存语义(EMS)统一了同步和存储原语,以解决并行编程的若干挑战: 允许...

    Docker.mmap

    1、Docker简介、 2、Docker安装、 3、Docker常用命令、 4、Docker镜像、 5、Docker容器数据卷、 6、DockerFile解析、 7、Docker常用安装、 8、本地镜像发布到阿里云、

    使用Windows共享内存技术 实现Python与C_C++程序间的数据传递.zip

    使用Windows共享内存技术 实现Python与C_C++程序间的数据传递

    Windows进程通信_共享内存

    两个控制台,一个动态库,加载后AB共享内存,可在IO线程中收发消息。这只是一个简单的demo,使用IPC中data_seg。

    py_boost_shmem:在boost之间映射共享内存的示例

    py_boost_shmem 在boost :: interprocess和Python的mmap之间映射共享内存的示例。 我在将python(使用mmap模块)中的共享内存连接到使用boost :: interprocess创建的C ++中的共享内存时遇到问题。 我开始工作了,想...

    shared-memory-dict:一个非常简单的共享内存字典实现

    共享内存区 一个非常简单的字典实现。 要求: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位)安装包

    python-3.8.8(32位64位)安装包 ... 现在,在正式的Beta版本中可用,Python 3.8带来了许多巧妙的语法更改,内存共享,更有效的序列化和反序列化,改进的字典等等。 自然地,Python 3.8也带来了各种性能改进。

    python简答题复习题库1

    对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享改副本。 8. 异常和错误有什么区别? 异常是指因为程序执行过程中出错而在正常控制流以外采取的行为。严格来说,语法错误和逻辑错误...

    python全套面试题

    Python 的内存管理机制主要依靠垃圾回收机制和引用计数机制。垃圾回收机制用于回收无用的对象,而引用计数机制用于跟踪对象的引用次数。 二、 Linux 基础和数据结构与算法 1. 10 个常用的 Linux 命令: * `cd`:...

    python 怎样进行内存管理

    从三个方面来说,主要有方面的措施:对象的引用计数机制、垃圾回收机制、内存池机制。...对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。 二、垃圾回收 1、当一个对象的引

    Python-3.8.0.tgz

    multiprocessing 现在可以使用共享内存段来避免进程之间的酸洗成本 typed_ast 被合并回CPython LOAD_GLOBAL 现在快40% pickle 现在默认使用协议4,提高了性能 还有许多其他有趣的更改,请查阅文档中的“新增功能”...

Global site tag (gtag.js) - Google Analytics