Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

上完厕所记得冲马桶

  最近发现之前用 node 写的工具在 mac 上跑的好好的,到 ubuntu 上偶尔会跑出了奇奇怪怪的行为。现象是往 stdout 中输出数据丢失,会莫名其妙地停留在 4094 字节上。关键是这个问题还是无法稳定重现的,好多次我以为没问题了,结果依然没解决。
  一开始我以为是管道的缓冲区大小问题,因为看到了 4096 字节正好等于管道缓冲区大小。而且我的代码确实是直接把所有数据写入到 stdout 的,就像这样 process.stdout.write(data);   于是我把这个数据分块写入,每一块都小于 4096 字节。当我跑了几次都正常工作,以为解决了这个问题的时候,突然问题又重现了。之后在这个地方坑了好久,用异步递归在每次 write 完成后再做下一次 write 都试过了,并没有卵用!
  然后就想了,会不会是别的原因呢?小概率出现的 Bug 可能是一些不稳定的因素造成是。于是我想到了进程结束时间是一个不稳定因素,是不是因为进程过早结束,导致后面的数据没来得及写入到管道中?我试着 hold 住进程让它延迟一段时间结束,确实就没再出现这个问题了。这时已经可以断定是进程过早结束导致了这个问题。但是代码不能这么写,所有依赖固定时间的程序都是耍流氓。于是又到谷歌上转了一圈,终于找到了方案。原来 node 的流本来就提供了 drain 事件,用于在数据都被冲入下水道后才触发。那么就应该这么写 let isDrained = process.stdout.write(data); if(!isDrained) { process.stdout.on('drain', () => process.exit(0)); }   突然感觉先前的代码完全是上完厕所没把马桶冲干净就跑了。数据还残留在马桶中,导致下水道中的数据不全。所以上完厕所把马桶冲干净还是很有必要的。
网名:
50.16.97.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^