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

Sharing information between a python code and c++ code (IPC)

本文关键字:代码 之间 共享 IPC 信息 python c++      更新时间:2023-10-16

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

  • 从C++程序到Python程序的许多小数据更新
  • 它们都在同一台计算机上运行
  • 可靠性很重要
  • 低延迟很好

我可以看到几个选项:

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

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

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

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

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

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

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