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

Python <-> C++ object oriented communication

本文关键字:面向对象 通信 C++ lt Python gt      更新时间:2023-10-16

我想用c++写一个守护进程,它将保存一个图形数据结构,并将计算一些依赖关系。我还想有Python批处理(也是一个守护进程-基于HTML的GUI的后端),这将允许用户对这些c++结构进行交互操作-添加/删除/连接/…节点和读取计算结果。

我想选择最好的通信机制。

强制功能是:

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

目前我在想:

    具有某种数据序列化机制的IPC(如0MQ)。
  1. 基于协议缓冲区或节俭的RPC。
  2. 基于Boost的集成Python
IPC和RPC解决方案看起来不错,但我必须编写一个大包装器才能从第1点获得功能。另一方面,我没有发现关于使用Boost的信息。Python在c++守护进程中,我不知道它是否可能。
  1. 提振。Python可以在守护进程中使用

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

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

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

我推荐Cython。它有很好的c++集成。它给了你很大的自由来使用c++,几乎没有样板文件。c++异常变成Python异常。不过,你可以微调很多东西。你应该试试。