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

时间:2013-05-28 09:26:52

标签: c++ python boost ipc rpc

我想在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应该能够获得有关很多节点的信息,并允许最终用户尽可能顺利地工作。
  4. 目前我在考虑:

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

      IPC和RPC解决方案看起来不错,但我必须编写一个大包装器来从第1点获取功能。另一方面,我没有找到有关在C ++守护程序中使用Boost.Python的信息,我不知道如果可能的话。

2 个答案:

答案 0 :(得分:4)

  1. Boost.Python可用于守护进程。

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

  3. 这两个解决方案之间的区别在于速度(Boost.Python肯定更快,但如果你指定正确的套接字选项,那么RPC并不是很慢 - TCP_NODELAY等)以及在Boost.Python的情况下你的二进制取决于在某个版本的Python上。在Thrift的情况下,您具有较少的依赖性,特别是如果Thrift本身作为您的OS分发包安装。无论如何,这是性能和部署的问题。如果不知道通信的速度有多快,以及您将在何处以及如何部署程序,就无法回答。

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

答案 1 :(得分:1)

我会推荐Cython。它非常体面C++ integration。它为您提供了很多自由,可以轻松地使用C ++,即几乎没有样板。 C ++异常成为Python异常。不过,你可以微调很多东西。你应该尝试一下。