Pipe 之美

Unix 三大宝是 C,file 和 pipe。C的重要性自不必说,如果 Lisp 是编程语言之母,那么 C 就是编程语言他爹。file 是 unix 世界的夸克 —— 在 unix 的哲学里,万事万物皆 file。文件自然是 file,socket 也是 file,各种硬件 device 还是 file。在你我凡俗眼中,这些东西风马牛不相及;在睿智的 unix 先驱们的眼中,他们都是 stream,而 file,是 stream 的容器。

我们翻开词典看看。stream 这个词本意是 a continuous flow of liquid, air, or gas。在 CS 这行当,它被生动地借用过来,表达 a continuous flow of data or instructions。当你打开一个文件,你可以往里面写东西,也可以读取内容;当你建立一对 socket 连接,你也可以全双工地读写。这个时候,不光是指令(instructions)在指尖流淌,数据(data)也在指缝里奔走。

我们知道,"a continuous flow of liquid" 一般都是通过管道运输的,比如说自来水管,或者输油管。pipe 就是管道。同理,"a continuous flow of data or instructions" 也需要 pipe 进行承载。

于是乎,pipe 就成了和 file 一样,在 unix 中无处不在的精灵。一条简单的命令:

tail -f /var/log/xxx.log | bunyan | grep -A 5 -B 10 ERROR

就让奔流的日志数据在若干个处理程序中游走(map / filter / reduce),直至最终呈现到我们的眼前。

在主流的编程语言中,对数据(或者数据处理流程)的 pipe 也越来越得到重视。不少语言直接在其 core 中内置了 pipe,如 elixir/scala 等语言 的 |>,nodejs 的 stream interface 等。上周五我在公司里分享了一个主题,就是关于 pipe 的。我将其分成了四种基本的处理:

  • pipe for single value
  • pipe for multiple values
  • pipe for single future value
  • pipe for multiple future values

在处理 multiple values 时,大家一定要注意容器(container)的选取。不是所有的场景都适合使用 array 作为 multiple values 的 container 的。很多时候,选择了合适的容器(数据结构),问题的解决就完成了一半。

分享的最后重点介绍了一下 node 的 transform stream,对于 nodejs developer 来说,这可能是使用频率最广的 stream 了。使用 transform stream 我们可以一路 pipe 出如下干净整洁的代码:

inputDataSet
    .pipe(transformation1)
    .pipe(transformation2)
    .pipe(transformation3)
    .reduce(reducer)

给出的代码继承自 ObjectTransform,这是我们内部封装的一个 Transform stream,你就把它当做正常的 Transform stream 理解就好了。:)

好,下面放毒(抱歉,slides 做得急而糙,有不少 typo,请容忍)。

原文发布于微信公众号 - 程序人生(programmer_life)

原文发表时间:2016-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喔家ArchiSelf

探索嵌入式应用框架(EAF)

EAF是Embedded Application Framework 的缩写,即嵌入式应用框架。嵌入式应用框架是 Application framework的一...

473
来自专栏牛客网

测开面经

楼主语言是python+c ,专业是通信工程、985硕 初始找工作倾向于python后台,但一直没得及自己独立开发项目,所以没底气。面经按照面试的时间顺序写的。...

4575
来自专栏华章科技

那些年,追过的开源软件和技术

笔者也是在互联网软件行业里面摸爬滚打十年多了,回头想想青葱岁月,很多时间都花在各种技术热潮的追逐上,有些是有价值的,也有些因为没人指导走过弯路,下面我就把我自己...

631
来自专栏程序员互动联盟

八招让你成为C/C++的编程大牛

这个题目的噱头太大,要真的写起来, 足够写一本书了。 本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路。 每个人的情况不一样,我下面的描述可能并...

2896
来自专栏老九学堂

【超详细】20K以上的高薪Java程序员所需技能大汇总

总所周知,Java是目前使用最为广泛的网络编程语言之一。 它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点。 一般的JAVA程序员或许只需知...

3584
来自专栏java一日一条

Java常见异常及解释

613
来自专栏java一日一条

Java常见异常及解释

常见 Java 异常解释:(译者注:非技术角度分析。阅读有风险,理解需谨慎:))

672
来自专栏新智元

网易有道CEO周枫:Go语言继承了C语言的灵活简单

来源:周枫 转载编辑:常佩琦 【新智元导读】网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;Go精选了一...

35112
来自专栏PHP技术

PHP之父:PHP7 性能翻倍关键大揭秘

原文出处: ithome 20岁老牌网页程序语言PHP,最快将在10月底释出PHP 7新版,这是十年来的首次大改版,最大特色是在性能上的大突破,能比前一版PHP...

3326
来自专栏腾讯数据中心

你必须认识的数据中心安全标识

行话说“年头出事白干一年,年尾出事一年白干”。临近年关,数据中心“安全”也变得热门了起来。数据中心的人身、物理及信息安全有千头万绪。今天,我们就从数据中心标识系...

4145

扫码关注云+社区