18

代码不会因为同步而降低效率吗?为什么同步编码是一种胜利?我在做一些研究时发现了这两个链接:http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads-in-node-js-what-for/,https : //github.com /Sage/streamlinejs/

如果目标是防止意大利面条式代码,那么显然您可以使用异步代码,例如 streamline.js,这不是回调金字塔,对吗?

4

2 回答 2

33

您必须在这里区分两件事:

  • 同步函数,如 node's fs.readFileSyncfs.statSync等。所有这些函数Sync的名称中都有一个 (*)。这些功能是真正同步阻塞的。如果你调用它们,你会阻塞事件循环并杀死节点的性能。您应该只在服务器的初始化脚本(或命令行脚本)中使用这些函数。
  • 库和工具,如fiberstreamline.js。这些解决方案允许您以同步方式编写代码,但您使用它们编写的代码仍将异步执行。它们不会阻塞事件循环。

(*)require也是阻塞的。

Meteor 使用纤维。它的代码是用同步风格编写的,但它是非阻塞的。

胜利不在于性能方面(这些解决方案有自己的开销,因此它们可能会稍微慢一些,但它们也可以比缓存等特定代码模式的原始回调做得更好)。胜利以及开发这些解决方案的原因在于可用性方面:它们让您以同步风格编写代码,即使您正在调用异步函数。

2017 年 1 月 25 日编辑:我创建了 3 个要点来说明非阻塞纤维: fibers-does-not-block.jsfibers-sleep-sequential.jsfibers-sleep-parallel.js

于 2012-08-28T20:18:58.950 回答
3

当使用类似streamlinejs. 实际代码仍将异步运行。写很多匿名回调函数不是很漂亮,这就是这些东西有帮助的地方。

于 2012-08-27T22:11:10.623 回答