node.js的内部 它是如何工作的

也许有人实现了node.js模块,可以解释在单个线程上处理的node.js队列与将由模块执行的阻塞IO操作之间的协议。

我怀疑它是这样的:

  1. node.js线程以封闭的forms注册一个callback,并保存一些关联id。
  2. node.js在模块上调用一个方法(应该阻塞IO),并将方法参数和相关ID传递给它。
  3. 模块方法旋转一个线程并阻止IO操作。
  4. 当IO操作完成时,模块的线程callback到node.js线程并将结果和相关ID传递给它。
  5. node.js线程通过关联id查找存储的callbackclosures,并用模块返回的结果调用它。

问题1:上面的顺序是否正确?

问题2: node.js队列究竟是什么? 是Windows上使用epoll,kqueue或IO完成端口的部分吗? 它是一个callback机制模块通知node.js线程,一些IO已经完成? 它是如何工作的?

Node.js并没有像你所猜测的那样真正处理这些事情。 而是依靠操作系统来完成大部分的asynchronousIO。 它根据操作系统使用select / epoll / kqueue。 “他们”只是发出一个呼叫,操作系统callback一个stream,大块等……就其中的一部分来说,这是内置于V8,它将所有的callback与特定事件它在浏览器中。 最后,您可以查看与节点一起写入的libuv,现在全由Joyent维护。 它是Github上的开源代码,所以你可以浏览代码,如果你真的想要的细节= D

我高度怀疑Node.JS与Twisted的走法相同,只使用非阻塞的IO和greenlet。 操作系统线程似乎是相当低效的这种事情。