在 python 代码和 c++ 代码 (IPC) 之间共享信息
Sharing information between a python code and c++ code (IPC)
我有 2 个代码库,一个在 python 中,一个在 c++ 中。我想在他们之间共享实时数据。我正在尝试评估哪个选项最适合我的特定用例:
- 从 C++ 程序到 python 程序的许多小数据更新
- 他们都运行在同一台机器上
- 可靠性很重要
- 低延迟真好
我可以看到几个选项:
- 一个进程写入一个平面文件,另一个进程读取它。它不可扩展、速度慢且 I/O 容易出错。
- 一个进程写入数据库,另一个进程读取它。这使它更具可扩展性,更不容易出错,但仍然很慢。
- 将我的 python 程序以一种或另一种方式嵌入到 C++ 中。我拒绝了该解决方案,因为两个代码库都相当复杂,出于可维护性的原因,我更愿意将它们分开。
- 我在两个程序中都使用了一些套接字,直接发送消息。这似乎是一个合理的方法,但没有利用它们在同一台机器上的事实(它会通过使用本地主机作为目的地来稍微优化,但仍然感觉很麻烦)。
- 使用共享内存。到目前为止,我认为这是我找到的最令人满意的解决方案,但缺点是实施起来稍微复杂一些。
我应该考虑其他解决方案吗?
首先,这个问题是高度基于意见的!
最干净的方法是在同一个进程中使用它们并让它们直接通信。唯一的复杂性是实现适当的 API 和 C++ -> Python 调用。正如您所指出的那样,缺点是可维护性,并且可能会降低健壮性(两者都会崩溃,在大多数情况下不是问题)和较低的灵活性(您确定永远不需要 运行 它们在不同的机器上吗?)。可扩展性是最好的,因为添加更多通信或更改现有通信非常简单。您可以重新考虑可维护性点。你 python 应用程序可以使用 w/o C++ 对应吗?如果不是,我不会那么担心可维护性。
那么共享内存是下一个选择,它具有更好的可维护性,但也有其他缺点。可扩展性稍微差一点,但还算不错。它可能很复杂,我不知道 Python 是否支持共享内存操作,对于 C++ 你可以看看 Boost.Interprocess。我首先要检查的主要问题是进程之间的同步。
然后,网络通信。这里有很多选择,从在套接字级别实现的最简单的二进制协议到注释中提到的更高级别的选项。这取决于您的 C++ <-> Python 通信的复杂程度以及将来的复杂程度。这种方法实施起来可能更复杂,可能需要第 3 方库,但一旦完成,它就具有可扩展性和灵活性。通常第 3 方库基于代码生成(Thrift、Protobuf),不会简化您的构建过程。
对于这种情况,我不会认真考虑文件系统或数据库。
我有 2 个代码库,一个在 python 中,一个在 c++ 中。我想在他们之间共享实时数据。我正在尝试评估哪个选项最适合我的特定用例:
- 从 C++ 程序到 python 程序的许多小数据更新
- 他们都运行在同一台机器上
- 可靠性很重要
- 低延迟真好
我可以看到几个选项:
- 一个进程写入一个平面文件,另一个进程读取它。它不可扩展、速度慢且 I/O 容易出错。
- 一个进程写入数据库,另一个进程读取它。这使它更具可扩展性,更不容易出错,但仍然很慢。
- 将我的 python 程序以一种或另一种方式嵌入到 C++ 中。我拒绝了该解决方案,因为两个代码库都相当复杂,出于可维护性的原因,我更愿意将它们分开。
- 我在两个程序中都使用了一些套接字,直接发送消息。这似乎是一个合理的方法,但没有利用它们在同一台机器上的事实(它会通过使用本地主机作为目的地来稍微优化,但仍然感觉很麻烦)。
- 使用共享内存。到目前为止,我认为这是我找到的最令人满意的解决方案,但缺点是实施起来稍微复杂一些。
我应该考虑其他解决方案吗?
首先,这个问题是高度基于意见的!
最干净的方法是在同一个进程中使用它们并让它们直接通信。唯一的复杂性是实现适当的 API 和 C++ -> Python 调用。正如您所指出的那样,缺点是可维护性,并且可能会降低健壮性(两者都会崩溃,在大多数情况下不是问题)和较低的灵活性(您确定永远不需要 运行 它们在不同的机器上吗?)。可扩展性是最好的,因为添加更多通信或更改现有通信非常简单。您可以重新考虑可维护性点。你 python 应用程序可以使用 w/o C++ 对应吗?如果不是,我不会那么担心可维护性。
那么共享内存是下一个选择,它具有更好的可维护性,但也有其他缺点。可扩展性稍微差一点,但还算不错。它可能很复杂,我不知道 Python 是否支持共享内存操作,对于 C++ 你可以看看 Boost.Interprocess。我首先要检查的主要问题是进程之间的同步。
然后,网络通信。这里有很多选择,从在套接字级别实现的最简单的二进制协议到注释中提到的更高级别的选项。这取决于您的 C++ <-> Python 通信的复杂程度以及将来的复杂程度。这种方法实施起来可能更复杂,可能需要第 3 方库,但一旦完成,它就具有可扩展性和灵活性。通常第 3 方库基于代码生成(Thrift、Protobuf),不会简化您的构建过程。
对于这种情况,我不会认真考虑文件系统或数据库。