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 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

如何用Python写一个贪吃蛇AI

这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过。但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了。 问题的关键在...

362
来自专栏Android-JessYan

我们为什么要把Dagger2,MVP以及Rxjava引入项目中?

原文地址: http://www.jianshu.com/p/91c2bb8e6369

513
来自专栏PPV课数据科学社区

对5种主流编程语言的吐槽

接下来要为大家,介绍五款让我又爱又恨的编程语言! 不可否认,想要成为一名优秀的程序员确实是需要掌握多种编程语言。通过这几年的自虐式学习,我也慢慢的掌握了这些编程...

32710
来自专栏目标检测和深度学习

教程 | 如何使用DeepFake实现视频换脸

1332
来自专栏coding

写下这行代码时,只有我和上帝知道是怎么回事01.烂代码的路径依赖02.对于烂代码应采取零容忍03.代码规范的重要性04.文档的重要性

"算了,这里的代码有说不清的玄机,重构相当于在给自己挖更大的坑,还是按照原来的写法吧..."

503
来自专栏牛客网

美团点评:前端工程师-实习面经 2018.03.231. 投递信息来源2. 投递及面试时间3. 面试过程4. 感受

1. 投递信息来源 感谢牛客网以及牛客网网友的帮助,招聘信息来自牛客网上美团点评的免笔试内推二维码。 2. 投递及面试时间 2018.03.09 - 网申(来...

3507
来自专栏WeaponZhi

机器学习股票价格预测从爬虫到预测(数据爬取部分)

各位朋友大家好,小之今天又来给大家带来一些干货了。上篇文章机器学习股票价格预测初级实战是我在刚接触量化交易那会,因为苦于找不到数据源,所以找的一个第三方平台来获...

1084
来自专栏phodal

【工具推荐】图像界的魔术师 ImageMagick

如果说 Pandoc 里文档界的瑞士军刀,那么 ImageMagick 就是图形界的瑞士军刀。 上周在为 Growth 制作插图的时候,需要:1. 合并不同的图...

2256
来自专栏CDA数据分析师

为什么说 Python 是数据科学的发动机(二)工具篇(附视频中字)

毋庸置疑,Python是用于数据分析的最佳编程语言,因为它的库在存储、操作和获取数据方面有出众的能力。 在PyData Seattle 2017中,Jake V...

19010
来自专栏java一日一条

对码农而言什么样的代码才能叫做好代码?

好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。

381

扫描关注云+社区