在python代码和c ++代码(IPC)之间共享信息

时间:2016-02-26 11:55:34

标签: python c++ ipc

我有2个代码库,一个在python中,一个在c ++中。我想在它们之间共享实时数据。我正在尝试评估哪个选项最适合我的特定用例:

  • 从C ++程序到python程序的许多小数据更新
  • 他们都在同一台机器上运行
  • 可靠性很重要
  • 低延迟很不错

我可以看到一些选项:

  • 一个进程写入一个平面文件,另一个进程读取它。它不可扩展,速度慢且I / O容易出错。
  • 一个进程写入数据库,另一个进程读取它。这使它更具可扩展性,略微不易出错,但仍然非常慢。
  • 将我的python程序以一种或另一种方式嵌入到C ++中。我拒绝了这个解决方案,因为两个代码库都相当复杂,出于可维护性的原因,我更愿意将它们分开。
  • 我在两个程序中都使用了一些套接字,并直接发送消息。这似乎是一种合理的方法,但没有利用它们在同一台机器上的事实(它将通过使用本地主机作为目的地进行略微优化,但仍然感觉很麻烦)。
  • 使用共享内存。到目前为止,我认为这是我发现的最令人满意的解决方案,但其缺点是实施起来稍微复杂一些。

我还应该考虑其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

首先,这个问题是基于意见的!

最干净的方法是在同一个过程中使用它们并让它们直接进行通信。唯一的复杂性是实现适当的API和C ++ - > Python调用。如您所述,缺点是可维护性并且可能降低稳健性(两者一起崩溃,在大多数情况下不是问题)和较低的灵活性(您确定您永远不需要在不同的机器上运行它们吗?)。可扩展性是最好的,因为添加更多通信或更改现有通信非常简单。您可以重新考虑可维护性点。你可以使用没有C ++对应的python应用程序吗?如果不是,我不会那么担心可维护性。

然后共享内存是下一个具有更好可维护性的选择,但同样存在其他缺点。可扩展性稍差但仍然不是那么糟糕。它可能很复杂,我不知道Python支持共享内存操作,对于C ++,你可以看看Boost.Interprocess。我首先要检查的主要问题是流程之间的同步。

然后,网络通信。这里有很多选择,从套接字级别实现的最简单的二进制协议到注释中提到的更高级别的选项。这取决于你的C ++< - >的复杂程度。 Python通信已经并且可能在将来。这种方法实现起来可能更复杂,可能需要第三方库,但一旦完成它就可以扩展和灵活。通常第三方库基于代码生成(Thrift,Protobuf),不会简化您的构建过程。

对于这种情况,我不会认真考虑文件系统或数据库。