Python 3.x 访问';共享内存';使用Python3.x<;3.8

Python 3.x 访问';共享内存';使用Python3.x<;3.8,python-3.x,shared-memory,python-3.8,Python 3.x,Shared Memory,Python 3.8,在我的应用程序中,多个进程依赖于一个源,一个摄像头或视频流Python3.8中引入的“共享内存”提供了一个简洁的解决方案,因为一个进程共享专用地址上的帧,而任何其他进程都会获取它。不幸的是,有一个进程依赖于在python3.8中不可用的库 是否可以通过可确定地址的标识符,使用Python 3.x

在我的应用程序中,多个进程依赖于一个源,一个摄像头或视频流Python3.8中引入的“共享内存”提供了一个简洁的解决方案,因为一个进程共享专用地址上的帧,而任何其他进程都会获取它。不幸的是,有一个进程依赖于在
python3.8
中不可用的库

是否可以通过可确定地址的标识符,使用
Python 3.x
<3.8获取“共享内存”

欢迎提出任何建议

您可以在进程之间使用和共享内存映射文件


你可以按照指导来做。

@Joac为我指明了正确的方向,我学到了更多关于共享内存的知识,
mmap
,然后还有关于
shmget
shmat
,等等。对于有兴趣了解更多信息的人,我发现以下视频和博客文章特别有用:

最后,我通过为Python2.x引入的模块解决了这个问题,实际上它的工作原理与我上面提到的原生Python3.8解决方案非常相似

共享Python3.8脚本中的视频并使用Python3.x
从多处理导入共享内存
进口cv2
将numpy作为np导入
如果名称=“\uuuuu main\uuuuuuuu”:
video_path=“/home/john/Videos/sample.mp4”
视频捕获=cv2.视频捕获(视频路径)
fps=视频捕获.get(cv2.CAP\u PROP\u fps)
返回值,frame=video\u capture.read()
shm=shared\u memory.SharedMemory(name=“video\u stream”,create=True,size=frame.nbytes)
共享_image=np.ndarray(frame.shape,dtype=frame.dtype,buffer=shm.buf)
共享图像[:]=帧[:]
尽管如此:
返回值,frame=video\u capture.read()
共享图像[:]=帧[:]
如果(返回值):
cv2.imshow('python3.8',共享图片)
延迟=整数((1/fps)*1000)
如果(cv2.waitKey(delay)&0xFF==ord('q')):
打破
视频捕获.发布()
cv2.destroyAllWindows()
导入mmap
进口cv2
将numpy作为np导入
导入posix_ipc
如果名称=“\uuuuu main\uuuuuuuu”:
shm=posix_ipc.SharedMemory(“/video_stream”)
mapfile=mmap.mmap(shm.fd,shm.size)
shared_image=np.ndarray((7201280,3),dtype=np.uint8,
buffer=mapfile.read())
尽管如此:
mapfile.seek(0)
shared_image=np.ndarray((7201280,3),dtype=np.uint8,
buffer=mapfile.read())
cv2.imshow('python3.6',共享图片)
如果(cv2.waitKey(1)&0xFF==ord('q')):
打破
cv2.destroyAllWindows()

感谢您的提示!目前尚不清楚的是,进程“b”是如何找到由进程“a”映射的数据的?这就是我所说的“标识符的方式”。
mmap
实现了文件接口,如果您在生产者上的位置42写入字节,您将能够在相同位置读取消费者上的数据。希望能有所帮助。对不起,我在写了这封信后读到了你的留言:如果我理解正确,
fileno
是标识符?!我会试试看。你说得对(我只是假设你在文件接口本身方面有问题),我会用一个简短的片段来扩展我的答案。