微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Python中从SharedMemoryManager访问共享内存

如何解决如何在Python中从SharedMemoryManager访问共享内存

我想做的是使用Python 3.8中的新SharedMemoryManager。
我已经仅使用shared_memory.SharedMemory模块成功共享了内存
服务器

import numpy as np
from multiprocessing import shared_memory
img = np.ones((700,700,3),np.int8)
shm = shared_memory.SharedMemory(name='uniquememoryname',create=True,size=img.nbytes)
b = np.ndarray(img.shape,dtype=img.dtype,buffer=shm.buf)
b[:] = img[:]  # copy the original data into shared memory
print('server started - run client Now')
time.sleep(20)
shm.close()
shm.unlink()

客户

import numpy as np
import cv2
from multiprocessing import shared_memory
existing_shm = shared_memory.SharedMemory(name='uniquememoryname')
img = np.ndarray((700,dtype=np.uint8,buffer=existing_shm.buf)
cv2.imshow('img',img)
cv2.waitKey()
existing_shm.close()

但是我现在想做的是能够使用管理器创建内存并访问它们。
到目前为止,我所拥有的:
服务器

# In the first Python interactive shell
if __name__ == '__main__':
    import time
    import numpy as np
    from multiprocessing.managers import SharedMemoryManager
    from multiprocessing import shared_memory

    img = np.zeros((700,dtype=np.uint8)

    with SharedMemoryManager(address=('127.0.0.1',50000),authkey=b'abc') as smm:
        shm = smm.SharedMemory(size=img.nbytes)

        # Now create a NumPy array backed by shared memory
        b = np.ndarray(img.shape,buffer=shm.buf)
        b[:] = img[:]  # copy the original data into shared memory

        print('server started - run client Now')

        time.sleep(20)


    print('server end')

客户

from multiprocessing.managers import SharedMemoryManager
# Attach to the existing shared memory block.
if __name__ == '__main__':
    smm = SharedMemoryManager(address=('127.0.0.1',authkey=b'abc')
    smm.connect()
    #what do i do Now to acess the img from server

那我现在需要在CLIENT中做什么才能从服务器访问b

解决方法

据我所知,没有办法获得当前管理的内存列表。您需要一种在服务器和客户端之间进行通信并传递名称的方法。从管理器中获取 SharedMemory 对象后,您就可以获取使用 shm.name 分配的名称。多处理队列可能是最简单的,名称只是一个字符串,因此如果您需要更复杂的东西,可以很容易地与任意数量的通信库一起发送。

服务器

# In the first Python interactive shell
if __name__ == '__main__':
    import time
    import numpy as np
    from multiprocessing.managers import SharedMemoryManager
    from multiprocessing import shared_memory

    img = np.zeros((700,700,3),dtype=np.uint8)

    with SharedMemoryManager(address=('127.0.0.1',50000),authkey=b'abc') as smm:
        shm = smm.SharedMemory(size=img.nbytes)
        name = shm.name
        # Here you need a way to communicate with the client to send the name

        # Now create a NumPy array backed by shared memory
        b = np.ndarray(img.shape,dtype=img.dtype,buffer=shm.buf)
        b[:] = img[:]  # Copy the original data into shared memory

        print('server started - run client now')

        time.sleep(20)


    print('server end')

客户

from multiprocessing.managers import SharedMemoryManager
from multiprocessing.shared_memory import SharedMemory
# Attach to the existing shared memory block.
if __name__ == '__main__':
    smm = SharedMemoryManager(address=('127.0.0.1',authkey=b'abc')
    smm.connect()
    # Here you need a way to access the unique name
    shm = SharedMemory(name=name)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?