如何在进程之间共享大量数据而不重复?(国际刑罚委员会)



我有一个进程,每秒向某个API发出一个http get请求。然后,此过程对从请求返回的 JSON 字符串执行某种工作。同时,我想将此 JSON 字符串传递给另一个进程以执行其他操作。

关键的一点是,我想继续将每个新的 JSON 字符串附加到数组的末尾,以便在程序运行期间将所有 JSON 字符串保存在内存中。

我正在考虑使用管道或 mmap 来共享 JSON 字符串,因为这些似乎是我所知道的最快的方法。但是,似乎管道会做比必要的更多的工作,因为我将不得不发送字符串,这似乎是不必要的,因为它们已经在内存中。

我认为如果我可以将数组映射到两个进程,mmap 将能够避免这个问题。我不希望字符串写入磁盘上的真实文件,所以我必须使用匿名映射,但似乎匿名映射会创建一个清零的区域,然后我将不得不将我的数组复制到内存映射区域以共享数据。这似乎也是不必要的工作,因为我正在复制内存。

有没有办法让我让第二个进程访问字符串数组,而无需重复字符串或复制?即使线程可以轻松共享内存,我也不能使用线程,因为发出 REST 请求的进程将是一个C++程序,而第二个进程将是一个 Python 程序。

看看boost interprocess.

您需要创建一个内存映射文件,该文件将传递给boost.interprocess allocator。此分配器采用内存映射文件的块。然后可以使用它们,就好像它们是由 std::分配器返回的一样。应用映射,以便内存与进程内特定内存兼容。

boost.interprocess容器将使用分配器返回的内存。它有一个类似 std::container 的接口。

您需要同步数据。这是通过一些进程间互斥锁完成的,应该用于防止数据访问争用条件。

或者,消息传递接口(MPI(是一种在进程之间进行通信的技术。这通常用于大型计算,例如车祸模拟等。

使用MPI您可以启动多个进程,这些进程通常使用不同的输入数据计算相同的内容。

MPI提供了创建MPI Window的可能性。借助此窗口,您可以写入其他MPI进程的内存。

因此,您的问题的答案是肯定的。但它带来了相当多的成本。MPI方案需要流程的启动器。您可能会遇到死锁、数据竞赛...

最新更新