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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值