【发布时间】:2020-05-28 05:24:57
【问题描述】:
我有一个进程每秒向某个 API 发出一个 http get 请求。然后,此过程对从请求返回的 JSON 字符串进行某种处理。同时,我想把这个 JSON 字符串传递给另一个进程做其他事情。
一个关键点是我想继续将每个新的 JSON 字符串附加到数组的末尾,以便在程序执行期间所有 JSON 字符串都保存在内存中。
我正在研究使用管道或 mmap 来共享 JSON 字符串,因为这些似乎是我所知道的最快的方式。但是,管道似乎会做比必要的工作更多的工作,因为我将不得不发送似乎不必要的字符串,因为它们已经在内存中。
我认为如果我可以将数组映射到两个进程,mmap 就可以避免这个问题。我不希望将字符串写入磁盘上的真实文件,因此我将不得不使用匿名映射,但似乎匿名映射会创建一个归零的区域,然后我必须将我的数组复制到映射的内存中区域共享数据。这似乎也是不必要的工作,因为我在复制内存。
有没有一种方法可以让第二个进程访问字符串数组而不复制字符串或复制?即使线程可以轻松共享内存,我也不能使用线程,因为发出 REST 请求的进程将是 C++ 程序,而第二个进程将是 Python 程序。
【问题讨论】:
-
当你说“大”是什么意思?几千字节?数百千字节?兆字节?
-
至于你的问题,inter-process communication 有很多方法,有些(如共享内存)可以在不复制数据的情况下工作。但是,您确实需要某种同步和互锁机制才能使共享内存正常工作。
-
@Someprogrammerdude 该数组将在程序终止时达到几千兆字节。另外, mmap 不是共享内存吗?我的印象是人们使用 mmap 来共享内存。
-
您可以使用
mmap将共享内存段映射到您的进程中,但需要围绕它进行一些其他工作才能创建或加载实际的共享内存分割。有很多关于如何做到这一点的教程。 -
@Someprogrammerdude 我阅读了以下关于共享内存的帖子,并且接受的答案似乎暗示 mmap 是共享内存的现代方式,而 linux 中以“shm”开头的共享内存函数似乎是旧的做事方式。 stackoverflow.com/questions/5656530/…