管道 (软件)

管道（pipeline），本源是使用消息传递的进程间通信机制，它构成自链接起来的处理元素（进程、线程、协程和函数等），它们被安置为每个元素的输出都是下一个元素的输入；这个名字类比于物理上的管道运输。在连贯的元素之间，通常会提供一定数量的缓冲区。在管道中流动的信息，经常是记录、字节或位的流（stream），而管道的元素可以叫做。将元素连接成管道类似于。在软件工程中，称之为管道与过滤器设计模式Jorge L. Ortega-Arjona. The Pipes and Filters Pattern. A Functional Parallelism Architectural Pattern for Parallel Programming. January 2005.。

概述
管道的概念是在Unix的发源地贝尔实验室由Douglas McIlroy在Unix开发期间主张的。与Unix的管道有关的更早期独立工作是Ken Lochner在1960年代为开发的“通信文件”The Evolution of the Unix Time-sharing System .。Tony Hoare在1978年提出的通信顺序进程（CSP），进一步发展了McIlroy的管道，但它用于通信的无缓冲区通道不是头等对象Russ Cox, Bell Labs and CSP Threads .。是开始于1980年的将管道想法向IBM的和z/OS系统的移植。

狭窄些说，管道是线性的和单向的，最典型的是Unix shell最初提供的管道语法。但是这个术语有时也应用于更一般性的流（flow）。例如，一个基本上单向的管道，可以有在另一个方向上一些通信，叫做“返回通道”或“反向通道”，就像在中那样，也有管道可以是完全双向的。有着单向树和有向无环图拓扑的流Tom Duff. Rc — The Plan 9 Shell . 1990.Diomidis Spinellis, Marios Fragkoulis. Extending Unix Pipelines to DAGs. April 2017. IEEE Transactions on Computers PP(99):1-1. ，由于没有环路而相对简单，使得它们表现得类似于（线性的）管道，因此也可以宽泛的称为“管道”dgsh — directed graph shell .。 

除了基于字节流（stream）的管道，还有对象管道。在对象管道中，处理元素输出对象而非文本。Windows PowerShell包含了一种内部的对象管道，在PowerShell运行时系统之内于函数之间传输.NET对象。在Limbo编程语言中的通道，是这种的另一个例子。

管道和，可以被看作使用字节流作为数据对象的一种形式的函数式编程；更具体的说，它们可以被看作是特定形式的I/O单子。

参见
 匿名管道
 基于组件的软件工程
 基于流程编程
 GStreamer，建造在插件管道上的多媒体框架。
 图形流水线

 命名管道，介于匿名管道和文件之间的操作系统构造。
 流水线 (计算机)，其他计算机相关的管道即流水线概念。
 ，将管道概念扩展成更一般的有向图结构。
 管道 (Unix)，Unix操作系统的管道。
 ，作为Plan 9一部份而开发的“智能管道” 。
 生产者消费者问题
 软件设计模式
 串流处理


注释

外部链接
 Pipeline Processing. 
 Parallel Programming: Do you know Pipeline Parallelism?

Category:进程间通信
Category:编程范式
Category:软件设计模式