在python代码和c++;代码(IPC) 我有2个代码库,一个在Python,一个在C++中。我想在他们之间共享实时数据。我正在尝试评估哪个选项最适合我的特定用例: 从C++程序到Python程序的许多小数据更新 它们都在同一台机器上运行 可靠性很重要 低延迟很好

在python代码和c++;代码(IPC) 我有2个代码库,一个在Python,一个在C++中。我想在他们之间共享实时数据。我正在尝试评估哪个选项最适合我的特定用例: 从C++程序到Python程序的许多小数据更新 它们都在同一台机器上运行 可靠性很重要 低延迟很好,python,c++,ipc,Python,C++,Ipc,我可以看到一些选择: 一个进程写入平面文件,另一个进程读取它。它不可扩展、速度慢且易于发生I/O错误 一个进程写入数据库,另一个进程读取数据库。这使得它更具可扩展性,不易出错,但仍然非常缓慢 Embed将我的Python程序变成C++或其他方法。我拒绝了这个解决方案,因为这两个代码库都相当复杂,出于可维护性的原因,我更愿意将它们分开 我在两个程序中都使用了一些套接字,并直接发送消息。这似乎是一种合理的方法,但没有利用它们在同一台机器上这一事实(使用本地主机作为目的地将略微优化,但仍然感觉很麻烦

我可以看到一些选择:

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

还有其他的解决方法吗?

< p>首先,这个问题是高度基于意见的! 最干净的方法是在同一流程中使用它们,并让它们直接通信。唯一的复杂性是实现适当的API和C++ ++ -python调用。缺点是您注意到的可维护性和潜在的较低的健壮性(两者一起崩溃,在大多数情况下都不是问题)和较低的灵活性(您确定永远不需要在不同的机器上运行它们吗?)。扩展性是最好的,因为添加更多通信或更改现有通信非常简单。您可以重新考虑这一点。Python应用程序可以使用W/O C++接口吗?如果不是,我就不会那么担心可维护性了

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

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


<>我不会认真考虑文件系统或数据库。这个例子:< /p>直接使用来自C++ C++的python/C++代码。api@Revolver_Ocelot,我拥有两个代码库,因此我可以在每个代码库中直接使用代码。这在很大程度上取决于您想要实现的目标,但也许Swig也是一个不错的选择。Apache Thrift是一个ZeroMQ替代方案,加上一个独立于语言的RPC框架。在这种情况下,“合适的API”是什么?我不明白。它们是独立的应用程序。我的意思是一个API,你想从C++侧调用,它可以是你需要的任何东西,但是更好的是把它放在一个单一的地方,比如FaxaDead模式(),用于无痛的维护。无论您选择什么选项,都可以使用这样的API。