python slice是共享內存嗎_python共享內存實現進程通信

1.概述

共享內存可以說是最有用的進程間通信方式.兩個不同的進程共享內存的意思是:同一塊物理內存被映射到兩個進程的各自的進程地址空間.一個進程可以及時看到另一個進程對共享內存的更新,反之亦然.采用共享內存通信的一個顯而易見的好處效率高,因為進程可以直接讀寫內存,而不需要任何數據的復制.對于向管道和消息隊列等通信等方式,則需要在內核和用戶空間進行四次的數據復制,而共享內存則只需要兩次數據復制:一次從輸入文件到共享內存區,另一個從共享內存區到輸出文件.實際上,進程之間在共享內存時,并不總是讀寫少量數據后就解除映射,有新的通信時,再重新建立共享內存區域.而是保持共享區域,知道通信完畢為止,這樣,數據內容就一直保存在共享內存中,并沒有寫回文件.共享內存中的內容往往是在解除映射時才寫回文件的.因此,采用共享內存的通信方式效率非常高.

mmap系統調用是的是的進程間通過映射同一個普通文件實現共享內存.普通文件被映射到進程地址空間后,進程可以向像訪問普通內存一樣對文件進行訪問,不必再調用read,write等操作.與mmap系統調用配合使用的系統調用還有munmap,msync等. 實際上,mmap系統調用并不是完全為了用于共享內存而設計的.它本身提供了不同于一般對普通文件的訪問方式,是進程可以像讀寫內存一樣對普通文件操作.而Posix或System V的共享內存則是純粹用于共享內存的,當然mmap實現共享內存也是主要應用之一.

2. python mmap模塊詳解

在python中,mmap.mmap()的函數實現在windows和linux上是不一樣的,但實現api接口函數很相似,下面以mmap的windows實現為例說明:

mmap.mmap(fileno, length[, tagname[, access[, offset]]])

fileno:the file handle fileno, 文件描述符

length:共享內存的大小

tagname: 共享內存區域的名字,可以理解為id

access:

ACCESS_READ: 只能讀,如果執行寫操作,raises a TypeError exception

ACCESS_WRITE: 可讀可寫

ACCESS_COPY: 可讀可寫,但不更新到文件中去

函數列表

mmap.close() 斷開映射關系

mmap.find(string[, start[, end]]):返回第一個string的索引,否則返回-1

mmap.move(dest, src, count): 移動count大小的內容從src到dest

mmap.read(num): 根據文件指針的位置兌取num個字節的內容,更新文件指針的位置

mmap.read_byte():讀取當前字符,更新文件指針位置

mmap.readline():Returns a single line, starting at the current file position and up to the next newline.從當前位置到下一行位置的所有內容

mmap.resize(newsize):Resizes the map and the underlying file,改變映射內存與文件大小

mmap.rfind(string[, start[, end]]): 返回最后一個string的索引

mmap.seek(pos[, whence]): 設置文件指針的位置

mmap.size(): 返回共享內存的大小

mmap.tell():返回當前指針的位置

mmap.write(string):從當前指針位置開始寫入string

mmap.write_byte(byte): Write the single-character string byte into memory at the current position of the file pointer; the file position is advanced by 1.

3.基于mmap和json實現內存共享

ObjectMmap繼承自mmap,結合json實現python obj的共享

jsonwrite(obj): 將可json序列化的obj對象寫入共享內存

jsonread_master():主進程獲取內存內容

jsonread_follower(): 從進程獲取內存內容

自定義的jsonmmap模塊:

#!/usr/bin/python

# -*- coding: utf-8 -*-

import mmap

import json

class ObjectMmap(mmap.mmap):

def __init__(self, fileno=-1, length=1024, access=mmap.ACCESS_WRITE, tagname='share_mmap'):

super(ObjectMmap, self).__init__(self, fileno, length, access=access, tagname=tagname)

self.length = length

self.access = access

self.tagname = tagname

def jsonwrite(self, obj):

try:

self.obj = obj

obj_str = json.dumps(obj)

obj_len = len(obj_str)

content = str(obj_len) + ":" + obj_str

self.write(content)

self.contentbegin = len(str(obj_len)) + 1

self.contentend = self.tell()

self.contentlength = self.contentend - self.contentbegin

return True

except Exception, e:

return False

def jsonread_master(self):

try:

self.seek(self.contentbegin)

content = self.read(self.contentlength)

obj = json.loads(content)

self.obj = obj

return obj

except Exception, e:

if self.obj:

return self.obj

else:

return None

def jsonread_follower(self):

try:

index = self.find(":")

if index != -1:

head = self.read(index + 1)

contentlength = int(head[:-1])

content = self.read(contentlength)

obj = json.loads(content)

self.obj = obj

return obj

else:

return None

except Exception, e:

if self.obj:

return self.obj

else:

return None

4.舉例

主進程:

#!/usr/bin/python

# -*- coding: utf-8 -*-

import mmap

from jsonmmap import ObjectMmap

import random

def main():

mm = ObjectMmap(-1, 1024*1024, access=mmap.ACCESS_WRITE, tagname='share_mmap')

while True:

length = random.randint(1, 100)

p = range(length)

mm.jsonwrite(p)

print '*' * 30

print mm.jsonread_master()

if __name__ == '__main__':

main()

從進程:

#!/usr/bin/python

# -*- coding: utf-8 -*-

import mmap

from jsonmmap import ObjectMmap

import time

def main():

mm = ObjectMmap(-1, 1024*1024, access=mmap.ACCESS_READ, tagname='share_mmap')

while True:

print '*' * 30

print mm.jsonread_follower()

if __name__ == '__main__':

main()

5.應用場景

主進程+多個從進程,主進程負責管理多個從進程,主從進程共享一個可序列化json對象,譬如說共享配置; 主進程才具備權限去修改配置,從進程僅僅具備訪問權限。

import mmap

mmap_file = None

##從內存中讀取信息,def read_mmap_info():

global mmap_file

mmap_file.seek(0)

##把二進制轉換為字符串 info_str=mmap_file.read().translate(None, b'\x00').decode()

print(info_str)##如果內存中沒有對應信息,則向內存中寫信息以供下次調用使用def get_mmap_info():

global mmap_file

##第二個參數1024是設定的內存大小,單位:字節。如果內容較多,可以調大一點 mmap_file = mmap.mmap(-1, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')

##讀取有效比特數,不包括空比特 cnt=mmap_file.read_byte()

if cnt==0:

print("Load data to memory")

mmap_file = mmap.mmap(0, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')

mmap_file.write(b"This is the test data")

else :

print("The data is in memory")

read_mmap_info()

##修改內存塊中的數據def reset_mmp_info:

global mmap_file

mmap_file.seek(0)

mmap_file.write(b'\x00')

mmap_file.write(b"Load data to memory agine")

if __name__=="__main__":

get_mmap_info()

說明:如果是使用python自帶的IDE,請重新打開一次此文件運行測試數據裝載到內存后的結果

簡單進程通信案例

#########################################################

#writer

import win32event as w32e

import mmapfile as mmf

#hEvent = w32e.OpenEvent(w32e.EVENT_ALL_ACCESS , 0 , "KaiMemEvent") #"Global\\JmdebuggerEvent"

pyMm = mmf.mmapfile(None , "KaiMem" ,1024)

hEvent = 1

if hEvent != None and pyMm != None:

#w32e.SetEvent(hEvent)

pyMm.write("hello world again!");

#############################################################

#reader

import win32event as w32e

import win32api as wapi

import mmapfile as mmf

#hEvent = w32e.CreateEvent(w32e.EVENT_ALL_ACCESS , 0 , 0 , "KaiMemEvent") #

#system_info=wapi.GetSystemInfo()

#page_size=system_info[1]

pyMm = mmf.mmapfile(None , "KaiMem" ,1024 )

hEvent = 1

if hEvent != None and pyMm != None :

#w32e.WaitForSingleObject(hEvent , -1)

buf = pyMm.read(22)

print buf

#wapi.CloseHandle(hEvent)

pyMm.close()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258593.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FCN-數據篇

從本篇開始,我們來記錄一下全卷積網絡用來做語義分割的全過程。 代碼:https://github.com/shelhamer/fcn.berkeleyvision.org 下面我們將描述三方面的內容: 1. 官方提供的公開數據集 2. 自己的數據集如何準備,主要是如何標注…

深圳本地網店代運營公司

◆★◆深圳本地網店代運營,淘寶代運營多少錢,微博運營公司,代運營平臺,天貓京東代運營,網站代運營圖 片, 北京京東代運營,網店代運營協議,京東店鋪代運營,網站代運營服務…

搜索專題題解

題目鏈接: codeforces 277A - Learning Languages 題目描述: 一個團體有n個人,每個人都掌握了一些語言,每個人學一門語言有1個花費,兩個人之間可以通過其他人的翻譯,問最少花費多少使得這個團體的任意兩個人…

Facebook 開源的快速文本分類器 FastTex

FastText是Facebook開發的一款快速文本分類器,提供簡單而高效的文本分類和表征學習的方法,性能比肩深度學習而且速度更快。 fastText 原理fastText 方法包含三部分:模型架構、層次 Softmax 和 N-gram 特征。下面我們一一介紹。 1.1 模型架構 …

FCN-加載訓練與測試數據

當我們生成了數據后,我們來看看FCN是如何加載數據的。 FCN 代碼預覽 其中: - data : 訓練測試數據 - ilsvrc-nets:存放預訓練的模型 - 剩下的框:不同數據集的訓練測試prototxt - voc_layers,siftflow_layers等&am…

怎么撤銷定時說說_已注冊商標遇到撤三申請怎么辦

很多企業的商標都遇到過商標撤三的情況,撤三簡單的說就是,注冊商標沒有正當理由連續三年不使用的,任何單位或者個人可以向商標局申請撤銷該注冊商標。所以說,無論您的企業多大,商標持有的再多,也要做好商標…

windows下架設SVN服務器并設置開機啟動

1、安裝SVN服務器,到http://subversion.apache.org/packages.html上下載windows版的SVN,并安裝,在命令行下運行svn命令,如下所以,則svn服務器安裝成功。 C:\Documents and Settings\Administrator>svn 使用“svn …

Spartan-6 FPGA SelectIO Resources User Guide 筆記2 SelectIO Attributes/Constraints

1.Location Constraint 用于分配I/O端口 NET <I/O_NAME> LOC "<EXTERNAL_PORT_IDENTIFIER>"; Example: NET MY_IO LOCR7; 2.IOSTANDARD Attribute 用于選擇IO標準如LVCMOS25&#xff0c;LVDS_25等 NET <I/O_NAME> IOSTANDARD”<IOSTANDARD V…

python合并pdf 加書簽_Python生成pdf目錄書簽的實例方法

有時候我們用的一些pdf資料是沒有目錄的&#xff0c;這樣找尋我們想到的東西比較麻煩。本篇文章就為大家帶來python來生成pdf目錄書簽的方法。首先&#xff0c;我們需要下載一個軟件FreePic2Pdf,利用它我們可以將我們的pdf文件導入書簽工具下載&#xff1a;https://www.jb51.ne…

正則表達式及其在python上的應用

今天學習了一早上正則表達式。如下內容部分轉載自《讀懂正則表達式就這么簡單》 一、什么是正則表達式 正則表達式是一種特殊的字符串模式&#xff0c;用于匹配一組字符串&#xff0c;就好比用模具做產品&#xff0c;而正則就是這個模具&#xff0c;定義一種規則去匹配符合規…

安全專家在硬盤固件中發現NSA的網絡間諜程序

本周安全專家在硬盤固件中發現了美國國家安全局&#xff08;NSA&#xff09;的網絡間諜程序&#xff0c;這些程序非常難以被檢測或者刪除。來自卡巴斯基的研究者公布了該惡意程序用來“Phone Home”的URL地址&#xff0c;NSA利用這些隨機、凌亂的地址來收集硬盤上的敏感數據。 …

SVN 分支/合并/切換

本文無條理性&#xff0c;僅作自我參考。 花費了兩個半下午&#xff0c;走馬觀花的看了一下說明文檔&#xff0c;SVN設計的太復雜&#xff0c;對我這樣的&#xff0c;不在一個集體的的業余開發者&#xff0c;要理解起來真是太難了。。。。 分支 Make branches as often as yo…

使用Firefox或Chrome的雇員表現更好不頻繁跳槽

一家銷售軟件幫助雇主招募雇員和留住雇員的公司Cornerstone OnDemand稱&#xff0c;使用非默認瀏覽器如Firefox或Chrome的雇員表現更好不頻繁跳槽。 這項研究旨在幫助那些跳槽率過高的行業&#xff0c;比如呼叫中心的年跳槽率高達45%。對50000名在線工作評估參與者的數據進行分…

關于FCN的數據集著色說明

前方我們講解了《 FCN-數據篇》。里面包含了如何制作類似pascal voc的label。很大篇幅在談如何著色&#xff0c;如何轉化為索引圖像。 由于一些內容參考網上的資料&#xff0c;所以對里面的一些操作含義也有些糊涂。 其實網上的東西也不都對&#xff0c;很多人云亦云。所以需要…

mongobd python_Python操作MongoDB數據庫PyMongo庫使用方法

引用PyMongo復制代碼 代碼如下:>>> import pymongo創建連接Connection復制代碼 代碼如下:>>> import pymongo>>> conn pymongo.Connection(localhost,27017)或復制代碼 代碼如下:>>> from pymongo import Connection>>> conn C…

Android Property Animation動畫

3.0以前&#xff0c;android支持兩種動畫模式&#xff0c;tween animation,frame animation&#xff0c;在android3.0中又引入了一個新的動畫系統&#xff1a;property animation&#xff0c;這三種動畫模式在SDK中被稱為property animation,view animation,drawable animation…

angular實現select的ng-options

ng實現簡單的select <div ng-controller"ngSelect"><select ng-model"vm.selectVal" ng-options"o.title for o in vm.optionsData"><option value"">請選擇</option></select> </div> var app …

Ubuntu14.04下Mongodb數據庫可視化工具安裝部署步驟(圖文詳解)(博主推薦)

不多說&#xff0c;直接上干貨&#xff01; 前期博客 Ubuntu14.04下Mongodb&#xff08;離線安裝方式|非apt-get&#xff09;安裝部署步驟&#xff08;圖文詳解&#xff09;&#xff08;博主推薦&#xff09; Ubuntu14.04下Mongodb官網安裝部署步驟&#xff08;圖文詳解&#x…

deeplab運行指南

以下僅僅為一個總結&#xff0c;參考了網上的眾多資料&#xff0c;僅備忘記。 主要鏈接 deeplab主頁&#xff1a;http://liangchiehchen.com/projects/DeepLab.html官方代碼&#xff1a;https://bitbucket.org/aquariusjay/deeplab-public-ver2python 版caffe實現&#xff1a…

tensorboard使用_colab打不開tensorboard的解決辦法

2020.4.1更新&#xff1a;colab現在自帶tensorboard的魔術方法了&#xff0c;用這個命令就能展示tensorboard%load_ext tensorboard %tensorboard --logdir ./log/train# 加載一次后&#xff0c;如果要重新加載&#xff0c;就需要使用reload方法 %reload_ext tensorboard %tens…