在 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调用。缺点是你注意到的可维护性,以及潜在的低健性(两者都崩溃在一起,在大多数情况下不是问题)和较低的灵活性(你确定你永远不需要在不同的机器上运行它们吗?可扩展性是最好的,因为添加更多通信或更改现有通信非常简单。您可以重新考虑可维护性点。你可以在没有对应物的情况下使用C++python应用程序吗?如果没有,我就不会太担心可维护性了。
那么共享内存是下一个选择,具有更好的可维护性,但具有相同的其他缺点。可扩展性有点差,但仍然没有那么糟糕。这可能很复杂,我不知道Python支持共享内存操作,C++你可以看看Boost.Interprocess。我首先要检查的主要问题是进程之间的同步。
然后,网络通信。这里有很多选择,从在套接字级别实现的最简单的二进制协议到评论中提到的更高级别选项。这取决于您的C++ <> Python 通信的复杂程度以及将来的复杂程度。这种方法可能更复杂,可能需要第三方库,但一旦完成,它就是可扩展和灵活的。通常,第三方库基于代码生成(Thrift,Protobuf),这不会简化您的构建过程。
在这种情况下,我不会认真考虑文件系统或数据库。
相关文章:
- 在c代码之间共享数据的最佳方式
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 如何在括号与代码之间添加空格以进行C++?
- 这两个代码之间的差异(为什么我的数组也有额外的空间,即使我限制了它)
- 无法将Android WebView渲染到C 和Java代码之间共享的外部纹理中
- 这些代码之间的区别在哪里?输出不应该是一样的吗?
- Objective-C源代码和clang -rewrite-objc C++代码之间有什么关系?
- 框架代码和普通代码之间的区别
- FFMPEG生成的零散的MP4文件和代码之间的不同之处在于
- 我不知道为什么只有一个代码在两个代码之间具有sigsegv(看起来相同)
- 为什么这两个代码之间的运行时间差异这么长
- C# 和 C++ 代码之间的链接在 64 位计算机中不起作用
- 在C++和Fortran代码之间传递复数数组
- 在C++和 Python 代码之间转移控制权
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 自定义Direct2D呈现托管代码和非托管代码之间的批封送处理
- 是否有Visual c++编译器在线,以及如何在c++和vs简单代码之间转换
- 在我的c++代码之间向matlab传递一个字符串变量
- 这些C++代码之间有什么区别