国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python進程間通信之共享內存詳解

2020-01-04 16:25:34
字體:
來源:轉載
供稿:網友

前一篇博客說了怎樣通過命名管道實現進程間通信,但是要在windows是使用命名管道,需要使用python調研windows api,太麻煩,于是想到是不是可以通過共享內存的方式來實現。查了一下,Python中可以使用mmap模塊來實現這一功能。

Python中的mmap模塊是通過映射同一個普通文件實現共享內存的。文件被映射到進程地址空間后,進程可以像訪問內存一樣對文件進行訪問。

不過,mmap在linux和windows上的API有些許的不一樣,具體細節可以查看mmap的文檔。

下面看一個例子:

server.py

這個程序使用 test.dat 文件來映射內存,并且分配了1024字節的大小,每隔一秒更新一下內存信息。

import mmapimport contextlibimport timewith open("test.dat", "w") as f:  f.write('/x00' * 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, '/x00')      m.write(s)      m.flush()      time.sleep(1)

client.py

這個程序從上面映射的文件 test.dat 中加載數據到內存中。

import mmapimport contextlibimport timewhile 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('/x00', '')      print s  time.sleep(1)

上面的代碼可以在linux和windows上運行,因為我們明確指定了使用 test.dat 文件來映射內存。如果我們只需要在windows上實現共享內存,可以不用指定使用的文件,而是通過指定一個tagname來標識,所以可以簡化上面的代碼。如下:

server.py

import mmapimport contextlibimport timewith 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 timewhile True:  with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_READ)) as m:    s = m.read(1024).replace('/x00', '')    print s  time.sleep(1)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱阳市| 东源县| 廊坊市| 新化县| 八宿县| 东明县| 九龙县| 平舆县| 那坡县| 石狮市| 汾西县| 资兴市| 和龙市| 平度市| 井研县| 承德市| 体育| 余姚市| 孝昌县| 揭东县| 仁怀市| 萨嘎县| 南宁市| 永泰县| 塔城市| 浦东新区| 南川市| 荣昌县| 策勒县| 正宁县| 台湾省| 长岭县| 独山县| 平谷区| 涞源县| 车险| 郸城县| 宿松县| 邮箱| 辽宁省| 保康县|