【问题标题】:Sharing information between a python code and c++ code (IPC)在 python 代码和 c++ 代码 (IPC) 之间共享信息
【发布时间】:2016-06-09 15:06:49
【问题描述】:

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

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

我可以看到几个选项:

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

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

【问题讨论】:

  • 从 C++/Python 直接使用 Python/C++ 代码?
  • RESTful API 应该对你最有帮助,一个完美的独立于语言的 api
  • @Revolver_Ocelot,我拥有 2 个代码库,所以是的,我可以在每个代码库中直接使用代码。
  • 这在很大程度上取决于您想要实现的目标,但也许 Swig 也是一个不错的选择。
  • Apache Thrift 是 ZeroMQ 的替代品,具有独立于语言的 RPC 框架。

标签: python c++ ipc


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在这种情况下,什么是“正确的 API”?我不明白。它们是独立的应用程序。
  • 我的意思是你想从 C++ 端调用的 API,它可以是你需要的任何东西,但最好把它放在一个地方,比如外观模式 (en.wikipedia.org/wiki/Facade_pattern),进行无痛维护。无论您选择什么选项,这样的 API 都可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2023-03-17
相关资源
最近更新 更多