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

Sha*_*ras 18 internals node.js

也许实现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查找存储的回调闭包,并使用从模块返回的结果调用它.

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

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

Sco*_*ott 9

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


Cam*_*lin -1

我高度怀疑 Node.JS 走的是与 Twisted 相同的路线,并且只使用非阻塞 IO 和 greenlet。操作系统线程对于这类事情来说似乎效率很低。