Meteor 的文档指出:
在 Meteor 中,您的服务器代码在每个请求中运行在一个线程中,而不是以 Node 典型的异步回调样式
他们真的是这个意思吗?
A)服务器并行运行多个线程(这在 Node.js 生态系统中似乎不寻常)
或者
B)事件服务器中仍然只有一个线程,并且每个请求都按顺序处理,至少直到它调用服务器外部的资源 - 例如数据存储,此时服务器本身正在处理回调,同时它处理其他请求,因此您不必自己编写/管理回调。
Meteor 的文档指出:
在 Meteor 中,您的服务器代码在每个请求中运行在一个线程中,而不是以 Node 典型的异步回调样式
他们真的是这个意思吗?
A)服务器并行运行多个线程(这在 Node.js 生态系统中似乎不寻常)
或者
B)事件服务器中仍然只有一个线程,并且每个请求都按顺序处理,至少直到它调用服务器外部的资源 - 例如数据存储,此时服务器本身正在处理回调,同时它处理其他请求,因此您不必自己编写/管理回调。
布拉德,你的 B 是正确的。
Meteor 在内部使用纤维。正如您所说,事件服务器中只有一个线程,但是当您执行(例如)数据库读取时,Fibers 产生并控制迅速返回事件循环。所以你的代码看起来像:
doc = MyCollection.findOne(id);
(带有隐藏的“屈服于事件循环,当文档在这里时回来”)而不是
MyCollection.findOne(id, function (err, doc) {
if (err)
handle(err);
process(doc);
});
Fiber 版本中的错误处理也只使用标准的 JavaScript 异常,而不是每次都需要检查参数。
我认为这会导致更容易阅读业务逻辑的代码样式,该业务逻辑想要采取一系列相互依赖的操作。但是,如果您想使用异步样式,大多数 Meteor 的同步 API 都可以选择接受回调并变为异步。