Python < - > C++面向对象的通信

Woj*_*ilo 5 c++ python rpc boost ipc

我想用C++编写一个守护进程,它将保存图形数据结构并计算一些依赖性.我还希望拥有Python Batch(也是守护进程 - 基于HTML的GUI的后端),它将允许用户在这些C++结构上进行交互操作 - 添加/删除/连接/ ...节点并读取计算结果.

我很乐意选择最好的沟通机制.

强制功能是:

  1. Python和C++应该能够以面向对象的方式在节点上运行,所以我希望能够编写类似的代码 n1 = node('a'); n2 = n1.add_subnode('b'); n2.ports('test').connect(node('c'))
  2. Python Batch不必与C++守护进程"分离" - 它们可以具有相同的生命周期(但是如果C++崩溃或出现错误,以某种方式将批处理从C++守护进程中分离出来会很好 - 这种分离是可选的)
  3. 通信应该很快 - Python应该能够获得有关许多节点的信息,并允许最终用户尽可能顺利地工作.

目前我在考虑:

  1. IPC(如0MQ)具有某种数据序列化机制.
  2. RPC基于Protocol BuffersThrift.
  3. 基于Boost.Python的集成

IPC和RPC解决方案似乎很好,但我必须编写一个大包装器来从第1点获取功能.另一方面,我没有找到有关在C++守护程序中使用Boost.Python的信息,我不知道它是否是甚至可能.

Ell*_*ioh 4

  1. Boost.Python 可以在守护进程中使用。

  2. Thrift 和 Protocol Buffers 工作正常。Thrift 实现了完整的 RPC 服务器,而 protobuf 除非去年情况发生了变化,否则只提供序列化。就我个人而言,我更喜欢节俭。

这两种解决方案之间的区别在于速度(Boost.Python 肯定更快,尽管如果您指定正确的套接字选项 - TCP_NODELAY 等,RPC 并不是很慢),而且事实上,在 Boost.Python 的情况下,您的二进制文件依赖于某个Python 版本。对于 Thrift,您的依赖关系较少,特别是当 Thrift 本身作为操作系统发行版的软件包安装时。无论如何,这是一个性能和部署的问题。如果不知道通信速度应该有多快,以及要在哪里以及如何部署程序,就无法回答这个问题。

UPD:你真的需要用 C++ 编写你的守护进程吗?如果这是因为在图上执行了大量计算,也许只有计算部分应该用 C++(扩展模块)?扩展通常优于其他技术。