如何解决如何在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 举报,一经查实,本站将立刻删除。