前⼀篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使⽤命名管道,需要使⽤python调研windows api,太⿇烦,于是想到是不是可以通过共享内存的⽅式来实现。查了⼀下,Python中可以使⽤mmap模块来实现这⼀功能。Python中的mmap模块是通过映射同⼀个普通⽂件实现共享内存的。⽂件被映射到进程地址空间后,进程可以像访问内存⼀样对⽂件进⾏访问。
不过,mmap在linux和windows上的API有些许的不⼀样,具体细节可以查看mmap的⽂档。下⾯看⼀个例⼦:server.py
这个程序使⽤ test.dat ⽂件来映射内存,并且分配了1024字节的⼤⼩,每隔⼀秒更新⼀下内存信息。
import mmapimport contextlibimport time
with open(\"test.dat\ f.write(' 00' * 1024)
with open('test.dat', 'r+') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_WRITE)) as m: for i in range(1, 10001): m.seek(0)
s = \"msg \" + str(i) s.rjust(1024, ' 00') m.write(s) m.flush() time.sleep(1)
client.py
这个程序从上⾯映射的⽂件 test.dat 中加载数据到内存中。
import mmapimport contextlibimport time
while True:
with open('test.dat', 'r') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_READ)) as m: s = m.read(1024).replace(' 00', '') print s time.sleep(1)
上⾯的代码可以在linux和windows上运⾏,因为我们明确指定了使⽤ test.dat ⽂件来映射内存。如果我们只需要在windows上实现共享内存,可以不⽤指定使⽤的⽂件,⽽是通过指定⼀个tagname来标识,所以可以简化上⾯的代码。如下:server.py
import mmapimport contextlibimport time
with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_WRITE)) as m: for i in range(1, 10001): m.seek(0)
m.write(\"msg \" + str(i)) m.flush() time.sleep(1)
client.py
import mmapimport contextlibimport time
while True:
with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_READ)) as m: s = m.read(1024).replace(' 00', '') print s
time.sleep(1)
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务