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

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运行读内存的程序。

分享到:
评论

相关推荐

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

    本文档“使用Windows共享内存技术实现Python与C/C++程序间的数据传递”将详细探讨如何在Windows环境下,通过共享内存技术来实现这两种语言编写的程序之间的高效数据通信。 首先,文档指出了Python在处理某些任务,...

    linux python共享内存

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

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

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

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

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

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

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

    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)统一了同步和存储原语,以解决并行编程的若干挑战: 允许...

    Windows进程通信_共享内存

    本示例中,我们关注的是使用共享内存这一IPC机制,通过动态链接库(DLL)实现两个控制台应用程序之间的通信。共享内存允许多个进程访问同一块内存区域,从而高效地传递大量数据。 标题“Windows进程通信_共享内存”...

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

    本话题聚焦于如何通过Windows操作系统提供的共享内存技术实现Python与C/C++程序之间高效的数据交换。共享内存是一种进程间通信(IPC,Inter-Process Communication)机制,允许不同进程访问同一块内存空间,从而达到...

    Docker.mmap

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

    Python技术内存管理技巧.docx

    例如,Python 的 `array.array` 模块就是一种内存复用的例子,它可以创建共享内存的数组,减少内存分配和释放的开销。 3. **迭代器和生成器**:这两种数据结构在处理大数据时能显著节省内存。迭代器遵循迭代协议,...

    获得进程内存使用量的python脚本.pdf

    这个脚本不仅计算每个程序的私有内存(private RAM),还会加上共享内存(Shared RAM)的总和。它会自动选择最精确的方法来适应你的操作系统内核,以提供准确的内存使用数据。 脚本的版本历史记录显示了其逐步改进...

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

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

    python并行编程pdf

    Python中,多线程主要利用共享内存,而多进程则通过管道和队列等方式在进程间进行数据交换。 内存管理包括内存分配、内存回收以及避免内存泄漏等问题。在Python中,内存管理是由Python的内存管理器自动完成的,但是...

    Python并行数值计算

    ### Python并行数值计算 ...此外,我们还探讨了如何在进程中使用共享内存,以及如何将共享内存数组转换为NumPy数组格式,以便于进行科学计算。这些技术和方法对于从事科学计算和数据分析领域的开发者来说至关重要。

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

    共享内存区 一个非常简单的字典实现。 要求:Python> = 3.8 >> from shared_memory_dict import SharedMemoryDict >> smd = SharedMemoryDict ( name = 'tokens' , size = 1024 ) >> smd [ 'some-key' ] = 'some-...

    Python-psmem一个用于精确报告Linux核心内存用量的简单Python脚本

    它弥补了传统 `ps` 和 `top` 命令在内存统计方面的不足,能够更准确地反映出各个进程实际占用的物理内存(Private Memory)和共享内存(Shared Memory)。这个工具对于系统管理员和开发者来说非常有用,可以帮助他们...

    MATLAB-Simulink-Ctrl.zip

    在本文中,我们将深入探讨如何利用第三方应用程序通过共享内存与MATLAB进行交互,进而控制Simulink模型的运行。这个主题主要围绕四个关键概念:MATLAB、Simulink、共享内存以及第三方应用程序。 首先,MATLAB是一种...

Global site tag (gtag.js) - Google Analytics