2013-05-28 37 views
5

我想用C++编写一个守护进程,它将保存一个图数据结构并计算一些依赖关系。我还想要Python Batch(也是一个守护进程 - 基于HTML的GUI的后端),它允许用户在这些C++结构上进行交互操作 - 添加/删除/连接/ ...节点并读取计算结果。Python <-> 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应该能够获得大量节点和信息让最终用户尽可能顺利地工作。用某种数据序列化机制

    1. IPC(如0MQ):

    目前,我在想什么。

  4. RPC基于Protocol BuffersThrift
  5. 集成基于Boost.Python

的IPC和RPC的解决方案似乎不错,但我必须写一个大包装,以获得从点1的功能在另一方面,我没有发现任何有关使用升压信息。 Python中的C++守护进程,我不知道它是否可能。

回答

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

  2. 节俭和协议缓冲工作正常。 Thrift在protobuf的同时实现了一个完整的RPC服务器,除非去年的情况发生了变化,只是提供序列化。我个人更喜欢节俭。

这两种解决方案之间的差异是速度(Boost.Python的绝对是速度更快,如果你指定了正确的套接字选项虽然RPC是不是真的慢 - TCP_NODELAY等),而事实上,在加速的情况下。 Python你的二进制文件取决于某个版本的Python。对于Thrift,您的依赖关系较少,特别是如果Thrift本身作为您的操作系统发行版的软件包进行安装。无论如何,这是一个性能和部署问题。如果不知道通讯应该多快,以及您将在何处以及如何部署您的程序,则无法回答。

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

+0

谢谢C++守护在C++,但经过一番调查我碰到一个想法来写的,它并没有成为守护 - 它可以写成一组使用'Cython'由Python中的库/' Boost.Python'。 C++部分是一个编译器,它将图形编译为一些二进制机器代码。我想我找到了解决办法 - 让Python的这将调用一些功能使用'Cython'是很好的解决方案我的C++库守护进程。 –

+0

同意。通常它是最好的可能的选择:实现一般控制逻辑在Python和提供的东西不能在Python进行如在C++实现的扩展模块。 – Ellioh

1

我会推荐Cython。它有非常体面C++ integration。它给你很大的自由来使用C++,而且几乎没有任何模板。 C++异常成为Python异常。不过,你可以微调很多东西。你应该尝试一下。