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 와 ACCESSCOPY 의 하나, offset 은 메모리 오프셋 을 표시 합 니 다.
이 글 의 인 스 턴 스 는 두 개의 프로그램 을 만 듭 니 다. 하 나 는 공유 메모리 에 문자열 을 쓰 고 다른 프로 세 스 는 공유 메모리 의 내용 을 읽 습 니 다.편리 함 을 위해 Tkinter Gui 프레임 워 크 를 사용 합 니 다. python 에 내 장 된 것 이기 때문에 QT 나 wxPython 등 제3자 GUI 라 이브 러 리 를 설치 할 필요 가 없습니다.코드 는 다음 과 같 습 니 다. 공유 메모 리 를 쓰 는 프로그램 입 니 다.
# 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!" 를 입력 한 다음 "Enter" 를 누 르 면 "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 에서 실행 시 명령 행 sharemm_demo. py 메모리 쓰기 프로 세 스 를 실행 하고 명령 행 sharemm_demo. py read 메모리 읽 기 프로그램 을 실행 합 니 다.

좋은 웹페이지 즐겨찾기