Warm tip: This article is reproduced from serverfault.com, please click

其他-如何在python和C / C ++中使用共享内存

(其他 - How to use shared memory in python and C/C++)

发布于 2018-03-05 04:57:21

我正在尝试修改python程序,以便能够使用共享内存与C ++程序进行通信。python程序的主要职责是从位于共享内存中的输入队列中读取一些视频帧,在该视频帧上执行某些操作,然后将其写回到共享内存中的输出队列中。

我相信我需要实现的目标很少,如果有人可以对此有所了解,那就太好了:

  1. 共享内存:在C / C ++中,你可以使用shmget和之类的函数shmat来获取指向共享内存的指针。用python处理此问题的等效方法是什么,以便python和C ++程序都可以使用同一块共享内存?

  2. 同步:因为这涉及到多处理,所以我们需要某种锁定机制,以用于C ++和python程序中的共享内存。我该如何在python中做到这一点?

非常感谢!

Questioner
HeiHei
Viewed
0
James McPherson 2018-03-06 03:31:32

也许shmget而且shmat不一定是最适合你使用的界面。在我从事的项目中,我们使用内存映射文件通过C和Python API提供对守护程序的访问,这为我们提供了一种非常快速的访问数据的方法

操作顺序如下所示:

  • 客户端door_call()通知后台程序创建共享内存区域
  • 守护程序安全地创建一个临时文件
  • 守护程序open(),然后mmap()是该文件
  • 守护程序通过以下方式将文件描述符传递回客户端 door_return()
  • 客户端mmap()是文件描述符,并将结构中连续放置的变量与该fd相关联
  • 客户对这些变量进行所需的任何操作-需要时。
  • 守护程序从共享区域读取并进行自己的更新(在我们的示例中,该守护程序将来自该共享区域的值写入日志文件)。

我们的客户利用图书馆来处理上述前5个步骤;该库随附了使用ctypes的Python包装器,以准确显示所需的函数和数据类型。

对于你的问题空间,如果只是python应用程序写入你的输出队列,那么你可以跟踪仅在python应用程序中处理过的帧。如果你的python和c ++应用程序都正在写入输出队列,那么这将增加你的难度,也许重构整个应用程序体系结构将是一项不错的投资。