我如何在进程之间共享大量数据而不进行重复? (IPC)

问题描述 投票:0回答:1

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

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

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

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

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

c++ pipe ipc mmap
1个回答
1
投票

看看boost interprocess

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

boost.interprocess容器将使用分配器返回的内存。它具有类似std :: container的界面。

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

或者,消息传递接口(MPI)是在进程之间进行通信的技术。通常,这是针对大型计算完成的,例如汽车碰撞模拟等。

使用MPI,您将启动多个进程,这些进程通常使用不同的输入数据来计算同一事物。

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

因此,您问题的答案是肯定的。但这会带来一些成本。 MPI业务情景需要您启动流程。您可能会陷入僵局,数据争用……...>

© www.soinside.com 2019 - 2024. All rights reserved.