c++ - 如何在不重复的情况下在进程之间共享大量数据?(IPC)
问题描述
我有一个进程每秒向某个 API 发出一个 http get 请求。然后,此过程对从请求返回的 JSON 字符串进行某种处理。同时,我想把这个 JSON 字符串传递给另一个进程来做其他事情。
一个关键点是我想继续将每个新的 JSON 字符串附加到数组的末尾,以便在程序执行期间所有 JSON 字符串都保存在内存中。
我正在研究使用管道或 mmap 来共享 JSON 字符串,因为这些似乎是我所知道的最快的方式。但是,似乎管道会做比必要的工作更多的工作,因为我将不得不发送似乎不必要的字符串,因为它们已经在内存中。
我认为如果我可以将数组映射到两个进程,mmap 就可以避免这个问题。我不希望将字符串写入磁盘上的真实文件,因此我必须使用匿名映射,但似乎匿名映射会创建一个归零的区域,然后我必须将我的数组复制到映射的内存中区域共享数据。这似乎也是不必要的工作,因为我正在复制内存。
有没有一种方法可以让第二个进程访问字符串数组而不复制字符串或复制?即使线程可以轻松共享内存,我也不能使用线程,因为发出 REST 请求的进程将是 C++ 程序,而第二个进程将是 Python 程序。
解决方案
看看boost interprocess
。
您需要创建一个内存映射文件,该文件被传递给boost.interprocess allocator
. 此分配器占用内存映射文件的块。然后可以像使用 std::allocator 返回的一样使用它们。应用映射以使内存与进程内特定内存兼容。
容器将boost.interprocess
使用分配器返回的内存。它有一个类似 std::container 的接口。
您需要同步数据。这是通过一些进程间互斥锁完成的,应该用于防止数据访问竞争条件。
或者,消息传递接口 ( MPI
) 是一种在进程之间进行通信的技术。这通常用于大型计算,例如车祸模拟等。
使用MPI
您启动多个进程,这些进程通常使用不同的输入数据计算相同的事物。
MPI
提供了创建MPI Window
. 借助此窗口,您可以写入其他MPI
进程的内存。
因此,您的问题的答案是肯定的。但它带来了相当多的成本。该MPI
方案需要您的流程的启动器。您可能会遇到死锁、数据竞争、...
推荐阅读
- r - 合并调色板颜色 colorRampPalette 并使用 ggplot 绘图
- java - Linux 中 process-exec-maven-plugin (bazaarvoice) 的类路径问题
- serialization - 存储 Apache Avro 模式的其他位置,而不是类路径
- sql-server - 不使用游标的 SQL Server 查询
- python - ValueError:尝试从聊天机器人获取回调消息时解包的值太多
- node.js - 在 Axios 的后端使用 GitHub api 的问题
- python - 你如何在 Pyglet 中绘制简单的形状?
- android - 捕获的图像小部件:失败的断言颤振
- oracle - PLSQL 循环遍历日期并将其用作参数
- java - 排除结束零,并从排序数组中重复元素