通过创建多个子shell并行运行管道

通过创建多个子shell并行运行管道

|我从这个答案中读到了和之间的区别; https://unix.stackexchange.com/a/159492/318084;

考虑两个命令 A 和 B。当你写

一个 | B
A和B并行执行,A的标准输出作为B的标准输入发送。

我对这个词感到困惑parallel

我可以理解描述管道 (Unix) - 维基百科

在类 Unix 计算机操作系统中,管道是通过标准流链接在一起的一系列进程,以便每个进程的输出 (stdout) 直接作为输入 (stdin) 传送到下一个进程。

管道将输出传递给下一个作为输入。

尽管如此,答案是“并行”,它们是同时执行而不是按顺序执行。

这个机制如何运作?

我想|应该生成一个子 shell,它从父 shell 中的 A 获取变量(导出变量),然后在作业完成时自动关闭子 shell。

答案1

管道是流处理的一个例子。一旦构建了管道,一旦数据到达所有进程,处理就会同时参与许多进程。想象一下 - 有三个数据 -a b c和两个进程 -AB。现在看看这些步骤:

  1. a@A B-a进入,里面还A没有任何东西B

  2. b@A a@B-a被传递Bb进入A

  3. c@A b@B-到达时c到达AbB

  4. A c@B-仅此A而已cB

想象一下,a非常大。如此之大,机器上一次只能存在两个元素。顺序处理要求首先处理它们,然后同时存储它们。并行处理不仅意味着较低的存储需求,而且还需要多个处理器——尽管这不是必需的,因为可以通过时间分配在单个处理器上模拟并行性。bcAB

管道的每个步骤都是在子 shell 中运行的单独进程。通常,特定进程中的输出会有缓冲,这意味着输出会以更大的块形式发送出去。这可以优化操作,但可能会被关闭,然后输出一旦准备好就会消失。但即使有更大的块,它仍然是并行的。

相关内容