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

时间:2011-12-20 12:26:46

标签: node.js internals

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

我怀疑它是这样的:

  1. node.js线程以闭包的形式注册一个回调,并用一些相关id保存它。
  2. node.js在模块上调用一个方法(应该执行阻塞IO),并将方法参数和相关ID传递给它。
  3. 模块方法旋转线程并阻止IO操作。
  4. 当IO操作完成时,模块'线程调用回node.js线程并将结果和相关ID传递给它。
  5. node.js线程按相关ID查找存储的回调闭包,并使用从模块返回的结果调用它。
  6. 问题1:以上序列是否正确?

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

2 个答案:

答案 0 :(得分:9)

Node.js并没有像你推测的那样真正管理任何这些。相反,它依赖于操作系统来完成大部分异步IO。它根据操作系统使用select / epoll / kqueue。 “他们”只是打出一个呼叫,操作系统用流,块等回调...就其中的部分内容而言,它内置于V8中,它完成所有工作,将回调绑定到特定事件,如同它在浏览器中。最后,您可以查看libuv,它与节点一起编写,现在全部由Joyent维护。它是Github上的开源,所以如果你真的想要详细信息= D

,你可以浏览代码

答案 1 :(得分:-1)

我非常怀疑Node.JS与Twisted的路由相同,只使用非阻塞IO和greenlets。操作系统线程对于这类事情似乎效率很低。