3

在利用并发方面,我经常将管道模式作为一种常见且有用的模式来阅读。但是我想知道并行管道模式与任务并行模式相比是否有任何优势。

假设我们在管道中有三个阶段:A、B、C。当需要处理数据时,A 拿走它,处理它并将其交给 B。当下一个数据块进入时,同样会发生 A 和 B正在同时工作。

所以管道中的不同阶段可以并行执行,但是当我们使用三个并行工作的管道时(如在任务并行模式中),我们得到完全相同的画面。当两个数据块相继进入时,第一个块由管道 1 获取,下一个块由管道 2 获取,并且两个块同时处理。

此外,我可以很容易地想象并行管道中的很多问题:阶段之间的缓冲区可能会阻塞(或溢出),一个阶段在处理速度方面占主导地位,因此最慢阶段之前的所有阶段都必须等待等等......

任务并行模式中不存在这些问题。此外,当块的进入速度超过管道的第一阶段处理它们的速度(或者它们可以同时获取)时,这种模式更加灵活。

那么我为什么要使用并行管道模式呢?

提前感谢您的任何想法!

4

1 回答 1

4

如果你有一个管道 A=>B=>C 并且没有进一步的限制,那确实没用。你可以只使用一个函数C(B(A(input)))

如果您在流水线阶段允许不同程度的并行性,该概念将变得更加有用。也许步骤 B 访问 SSD,而您最多需要 4 个并发访问。您可以使用信号量来实现相同的目的。

如果 A、B 和 C 的并行度限制为 1,则管道也具有价值:在管道模型中,所有 3 个节点都可以同时执行。由于假定的并行度限制,使用“三个管道”是不可能的(或者您需要 3 个与管道解决方案等效的锁)。

有时,您希望在节点之间进行缓冲。也许,A 很少发出 B 会随着时间的推移处理的高脉冲。缓冲有助于保持 A 正常工作而不是停滞不前。

有时,它不是管道,而是分支进出(可能连接)的数据流网络。

总而言之,我很少找到数据流网络的用例。通常,仅使用数据并行性并使用适当的锁和信号量会更简单。但这可能是因为我通常工作的领域。YMMV。

于 2016-08-24T11:20:28.837 回答