【问题标题】:How does this.unblock work in Meteor?this.unblock 如何在 Meteor 中工作?
【发布时间】:2015-09-03 00:48:36
【问题描述】:

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 请求时才会解除阻塞,但如果我们运行长时间的计算就不会发生解除阻塞?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    Fibers 是 Node 事件循环之上的一个抽象层。它们改变了我们编写代码以与事件循环交互的方式,但它们不会改变 Node 的工作方式。 Meteor 是一种用于 Fibers 的 API。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-07
      • 2013-09-17
      • 2015-05-25
      • 1970-01-01
      • 2015-10-11
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多