我正在尝试修改python程序,以便能够使用共享内存与C ++程序进行通信。python程序的主要职责是从位于共享内存中的输入队列中读取一些视频帧,在该视频帧上执行某些操作,然后将其写回到共享内存中的输出队列中。
我相信我需要实现的目标很少,如果有人可以对此有所了解,那就太好了:
共享内存:在C / C ++中,你可以使用shmget
和之类的函数shmat
来获取指向共享内存的指针。用python处理此问题的等效方法是什么,以便python和C ++程序都可以使用同一块共享内存?
同步:因为这涉及到多处理,所以我们需要某种锁定机制,以用于C ++和python程序中的共享内存。我该如何在python中做到这一点?
非常感谢!
也许shmget
而且shmat
不一定是最适合你使用的界面。在我从事的项目中,我们使用内存映射文件通过C和Python API提供对守护程序的访问,这为我们提供了一种非常快速的访问数据的方法
操作顺序如下所示:
door_call()
通知后台程序创建共享内存区域open()
,然后mmap()
是该文件door_return()
mmap()
是文件描述符,并将结构中连续放置的变量与该fd相关联我们的客户利用图书馆来处理上述前5个步骤;该库随附了使用ctypes的Python包装器,以准确显示所需的函数和数据类型。
对于你的问题空间,如果只是python应用程序写入你的输出队列,那么你可以跟踪仅在python应用程序中处理过的帧。如果你的python和c ++应用程序都正在写入输出队列,那么这将增加你的难度,也许重构整个应用程序体系结构将是一项不错的投资。
感谢您的建议。请您简要说明一下我该如何实现
door_call()
和door_return()
我自己,因为它们显然是Oracle的功能?是信号,unix套接字还是别的东西?我花了一些时间看一下CPython,发现我们可以直接使用Py_xxx直接调用python函数。将视频帧作为参数直接传递给Py_xxx(frame)而不是使用共享内存,并从此函数的返回值中获取处理后的帧,会更有效吗?或对此有任何缺点?
再问一下关于
door_call()
和的问题door_return()
:我不确定这些功能是否已在linux中完全实现;rampant.org/doors/index.html有点过时了。您最好改用Unix域套接字。CPython可能会为您提供所需的功能。您将需要评估在给定用例和功能需求的情况下效率如何(并且坦率地说)。