Python 共享内存

清理文件,记录一下共享内存的代码。后面再解析理解。

server.py

import mmap
import contextlib
import time
import zeep
import numpy as np
import cv2
import time
from onvif import ONVIFCamera
import requests
from requests.auth import HTTPDigestAuth
with open("test.dat", "w") as f:
    f.write('\x00' * 1024)

def zeep_pythonvalue(self, xmlvalue):
    return xmlvalue
# 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)).encode()
#             # s=s.rjust(1024, '\x00').encode()
#             print(s)
#             m.write(s)
#             m.flush()
#             time.sleep(1)



class onvifCamera(object):
    def __init__(self, ip: str, username: str, password: str):
        self.ip = ip
        self.username = username
        self.password = password
        zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
        self.init_ipc()
    def init_ipc(self):
        try:
            self.mycam = ONVIFCamera(self.ip, 80, self.username, self.password)
            self.media = self.mycam.create_media_service()  # 创建媒体服务
            self.media_profile = self.media.GetProfiles()[0]  # 获取配置信息
            # self.ptz = self.mycam.create_ptz_service()  # 创建控制台服务
            # print(self.media_profile)
            return True
        except Exception as e:
            print(e)
            return False

    def Snapshot(self):
        """
        截图
        :return:
        """
        res = self.media.GetSnapshotUri({'ProfileToken': self.media_profile.token})

        response = requests.get(res.Uri, auth=HTTPDigestAuth(self.username, self.password))
        print(len(response.content))
        return response.content
        # with open(self.save_path, 'wb') as f:  # 保存截图
        #     f.write(response.content)
camera0 = onvifCamera('192.168.8.153','admin','tensorsight666')
with open('test.dat', 'w+') as f:
    with contextlib.closing(mmap.mmap(f.fileno(), 1024*1024, access=mmap.ACCESS_WRITE)) as m:
            while True:
                m.seek(0)
                # s = ("msg " + str(i)).encode()
                image_buff = camera0.Snapshot()
                s=image_buff
                # s=s.rjust(1024, '\x00').encode()
                # print(s)
                image = cv2.imdecode(np.fromstring(s, np.uint8), 1)
                cv2.imshow('cv0', image)
                cv2.waitKey(1)
                m.write(s)
                m.flush()
                time.sleep(1)
# image_buff =camera0.Snapshot()

client.py

# -*- coding:utf-8 -*-
# SodrSnne's PYTHON
# @Time    : 2021/2/20 17:29
# @Email   : jisashandianmao@163.com
# @File    : client.py
# @Software: PyCharm
_author_ = 'SodrSnne'
import mmap
import contextlib
import time

import mmap
import contextlib
import time
import numpy as np
import cv2

while True:
    with open(r'E:\Business_projects\onvifs\ctrlcamrera\192.168.8.153\data.dat', 'r') as f:
        with contextlib.closing(mmap.mmap(f.fileno(), 1024*312, access=mmap.ACCESS_READ)) as m:
            s = m.read(1024*1000)#.replace('\x00', '')
            image = cv2.imdecode(np.frombuffer(s, np.uint8), 1)
            cv2.imshow('cv', image)
            cv2.waitKey(1)
            # print(s)
    time.sleep(1)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python提供了共享内存的实现方式,可以通过使用multiprocessing模块中的SharedMemory类来实现。 共享内存是一种进程间通信方式,允许两个不相关的进程访问同一段逻辑内存。这种方式非常高效,可以在进程之间共享和传递数据。共享内存的实现原理是不同进程之间连接同一段物理内存,在进程的地址空间中将这段物理内存连接起来,从而实现数据的共享。当某个进程向共享内存写入数据时,其他进程可以立即访问到这些数据的改动。 共享内存Python中的实现方式是使用SharedMemory类,通过该类可以创建共享内存对象,并在多个进程之间实现数据共享。首先,我们需要创建一个共享内存对象,可以通过指定共享内存的名称和大小来创建。然后,可以通过get_fd()方法获取共享内存的文件描述符,然后可以在其他进程中使用该文件描述符来连接到同一段共享内存。在连接到共享内存后,就可以在不同的进程中读取和写入共享内存中的数据。 总结来说,Python中的共享内存提供了一种高效的进程间通信方式,可以在不同的进程之间实现数据的共享和传递。通过使用SharedMemory类,可以创建共享内存对象,并在多个进程之间实现数据的读取和写入。这种方法可以提高程序的性能和效率,特别是在需要进程间快速交换大量数据的情况下。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python进程通信方式总结(三):共享内存](https://blog.csdn.net/submarineas/article/details/113824445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python - mmap 共享内存](https://blog.csdn.net/zywvvd/article/details/122778874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值