用不同的语言调用不同的子进程,最好是共享内存

Posted

技术标签:

【中文标题】用不同的语言调用不同的子进程,最好是共享内存【英文标题】:Call different subprocesses in different languages, ideally shared memory 【发布时间】:2015-09-28 06:56:47 【问题描述】:

我正在研究一个大数据解决方案。通常我从一大块大数据开始,对其进行处理,然后将结果发送到下一个工具以进行更多处理,等等。以下是这样一个工具链的外观的一个小例子。大多数情况下它不深(2或3级),根部的扇出通常也小于3。但叶子的扇出很容易达到100。

这些工具来自多种来源,并且可以是闭源的。所以我无法将所有工具的输入和输出转换为通用格式。此外,这些工具将以不同的语言编写。 C、Java、Python、Bash、...

最终产品将在具有大量 RAM 的服务器上运行。所以我想使用内存中的共享内存解决方案。

根工具是一个调解器(注意:这是我解决问题的想法,当然我可能是错的,会有更好的方法)。中介将工具链作为输入(子流程的选择和顺序将由用户选择),调用不同的子流程,分发数据,在子流程完成时接收来自子流程的信号,然后可以运行下一个。同一级别的子进程应该并行运行。

现在我的问题是:首先 - 这是一个好的设计吗?第二:哪种 API/函数/编程技术最适合调用所有这些进程以便它们共享 RAM? (所以也许共享 RAM 并不总是可行的。这不是那么重要。)

mediator
|-- toolA
|    |-- toolA1
|    |    |-- toolA11
|    |    +-- toolA12
|    +-- toolA2
|         +-- toolA21
+-- toolB
    |-- toolB1
    |-- toolB2
    +-- toolB3

【问题讨论】:

【参考方案1】:

我不太确定我是否理解您的所有问题/解释,但如果您想避免使用文件系统编写中间文件(一个工具的输出文件是下一个工具的输入文件),如果您有您的服务器上有足够的可用内存来存储这些文件,那么您可以考虑使用内存文件系统。

例如,如果您在 Linux 上运行,则可以使用 /dev/shm 作为工作的基本目录,或者将更方便的目录挂载为 tmpfs...

【讨论】:

谢谢,这已经帮了很大的忙,但是你能回答我对工具的调用应该是什么样子吗? tempf 可能是内存处理的解决方案,但共享内存对我的用例来说更为重要。这将如何运作? popen(), fork(), ...? 我会选择一个 shell 脚本和通常的 | 嫌疑人。由于您无权访问源代码,因此只需将游览工具视为黑匣子,仅让它们通过内存中的文件系统进行交互。 Afaik shell 解决方案不允许共享内存。并非所有工具都是黑盒,其中不少是我们自己的工作。即使当我使用 tempfs 时,我也有开销将文件复制到内存段以供下一个工具使用。我也想避免这种情况。未来还应该有一个优先级队列,甚至可能还有更多我们想不到的功能。我不认为一个shell脚本就足够了。 C 中有哪些选项可以获得相同的结果? 好的,我不确定我是否已经掌握了所有信息,但我看到的一种可能性是使用 /dev/shm 作为黑盒工具的文件系统,(您可以像通常的文件系统一样在那里读/写),并将那里的数据用作您拥有源的工具的共享内存段。那么shm_openmmap 是你的朋友...

以上是关于用不同的语言调用不同的子进程,最好是共享内存的主要内容,如果未能解决你的问题,请参考以下文章

访问共享内存段的进程返回不同的值

Linux 进程间通信 --共享内存

Linux进程间通信——使用共享内存

Linux进程间通信——使用共享内存

Linux进程间通信——使用共享内存

Linux学习笔记(14)-进程通信|共享内存