我最近一直在处理 Meteor(某种遗留)代码。我知道后端代码会(类型明智)阻塞对 Mongo 的调用,但我被告知这些调用在光纤上工作。 据我所知,这些在光纤上运行的代码看起来与阻塞代码完全相同。 有人告诉我没关系,但我想知道这是如何实现的。 我有 Scala 背景,我知道 Fiber 需要某种暂停机制,允许计算等待,直到某个结果可用。 这在经典的阻塞代码中是不可能的。 (对于 Scala,平面映射将计算与回调分开)
换句话说... Meteor.bindEnvironment 是做什么的?
使用 async/await 或生成器/yield 可以实现这一点。但除此之外呢?如何?流星纤维如何工作? 在进行 HTTP 等 I/O 操作或使用文件系统时,如何避免阻塞唯一可用的线程?
Meteor 是在回调地狱盛行的时代设计的,因此他们选择了 Fiber,通过同步代码使构建应用程序变得更加简单。 Meteor Fiber 实现基于 node-Fibers,从 Nodejs v16.0.0 开始不再支持,这就是 Meteor 尝试用 async/await 和 async hooks 替换 Fiber 的原因。
如果您想了解更多有关 Meteor 中纤维材料如何工作的信息,我推荐 Ben Newman talk 和 slides。还有这个答案。