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

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

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

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

    最佳答案

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

    最干净的方法是在相同的过程中使用它们并使它们直接通信。唯一的复杂性是实现正确的API和C++-> Python调用。如前所述,缺点是可维护性,潜在的缺点是健壮性(两种情况都崩溃,多数情况下都不是问题)和灵活性较低(您确定永远不需要在其他计算机上运行它们了吗?)。可扩展性是最好的,因为添加更多通信或更改现有的内容非常简单。您可以重新考虑可维护性点。可以在不使用C++的情况下使用python应用程序吗?如果没有的话,我不会担心可维护性。

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

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

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

    07-24 09:46
    查看更多