5

我想用 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. 基于Protocol BuffersThrift的 RPC 。
  3. 基于Boost.Python的集成

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

4

2 回答 2

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

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

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

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

于 2013-05-28T10:55:25.630 回答
1

我会推荐赛通。它具有非常不错的C++ 集成。它为您提供了很大的自由来使用 C++,而且几乎没有任何样板。C++ 异常变成 Python 异常。不过,你可以微调很多东西。你应该试试看。

于 2013-05-28T09:57:06.917 回答