this.unblock如何在Meteor中运行?

时间:2015-09-02 07:37:30

标签: meteor

this.unblock如何在Meteor中运作?

文档说:

Call inside a method invocation. Allow subsequent method from this client to begin running in a new fiber.

On the server, methods from a given client run one at a time. The N+1th invocation from a client won't start until the Nth invocation returns. However, you can change this by calling this.unblock. This will allow the N+1th invocation to start running in a new fiber.

如果Node在单个线程中运行,新代码如何开始在新光纤中运行?当我们得到I / O请求时它是否只会解锁,但如果我们运行长计算则不会发生解锁?

1 个答案:

答案 0 :(得分:1)

Fibers是Node的Event Loop之上的抽象层。它们改变了我们编写代码以与Event Loop交互的方式,但它们并没有改变Node的工作方式。除其他外,Meteor是Fibers的一种API。

Meteor中的每个客户端请求都会创建一个新光纤。默认情况下,客户端调用的流星方法将排在一起。这是默认行为,因为假设您希望在继续执行之前为所有客户端更新Mongo。但是,如果您不需要客户端使用最新的最新全局变量或数据,则可以使用this.unblock()将每个客户端请求放入Node的事件循环中,而无需等待之前的完成。但是,我们仍然受限于Node的事件循环。

所以this.unblock()通过允许对该方法的所有客户端请求进入事件循环(基于回调的非IO阻塞执行)来工作。但是,由于Node仍然是单线程应用程序,因此CPU密集型操作将阻止事件循环中的回调。这就是为什么Node不是CPU密集型工作的好选择,而且不会因Meteor或Meteor与Fibers / Event Loop的交互而改变。

一个简单的类比:事件循环或我们的单个节点线程是一条高速公路。高速公路上的每辆车都是一个复杂的事件驱动功能,当它的回调完成时最终会从高速公路上退出。纤维使我们能够更容易地控制谁在高速公路上和何时上路。默认情况下,流星方法一次允许在高速公路上使用单辆汽车,但是当正确使用this.unblock()时,您可以在高速公路上使用多辆汽车。但是,任何光纤上的CPU密集型操作都会导致交通堵塞。 I / O和网络不会。