为什么node.js在单线程时速度很快?
Why node.js is fast when it's single threaded?
尽管是单线程,node.js是如何更快的?我没有运行任何测试来查找统计数据,但是在node.js论坛中挖掘时,我发现每个人都说它更快,更轻量级。但是无论多么轻量级,单线程服务器怎么可能比多线程服务器更快呢?
首先,为什么多线程时程序更快?
部分原因是多线程程序可以在多个内核上运行,但主要原因是,到目前为止,当一个线程正在等待一些IO操作时(这种情况很常见,特别是在服务器中),其他线程仍然可以进行。
那么node呢
Node不是单线程。JS中的用户脚本在一个线程中执行,但是所有的IO操作都是由libuv和操作系统本地处理的,它们是多线程。
这里有更多的解释
在实践中,这意味着并行处理多个请求。下面是一个非常(非常)简化的操作序列示例:
user script | node + OS "threads" (libuv)
-------------------------------------------------------------
receive and analyze request 1 |
ask node for file 1 | fetching file 1
receive and analyze request 2 | fetching file 1
ask node for file 2 | fetching file 1, fetching file 2
prepare response header 1 | fetching file 2
tell node to send file 1 | send file 1, fetching file 2
prepare response header 2 | send file 1
tell node to send file 2 | send file 1, send file 2
node(和io.js)的整个架构使得拥有高水平的并行性变得很简单。用户线程只在非常短的任务中被事件循环调用,这些任务在下一次IO操作时停止(好吧,不仅仅是IO,但大多数情况下),当你的代码给node一个回调,该回调将在操作完成时被调用。
当然,这只在使用Node的异步函数时才有效。任何时候你使用一个以"Sync"结尾的函数,比如writeFileSync,你就是在破坏并发性。
Node.js不是单线程的:参见https://nodejs.org/about/:
任何连接都可以并发处理
实际上,它不使用系统线程,而是使用V8引擎和libuv库通过异步回调实现多线程。
也可以通过child_process.fork
使用额外的子进程最后,这并不以任何方式限制响应速度或发动机的总速度。
因为nodejs不会等待响应,而是遵循带有回调的事件驱动编程,即一旦请求被提交,它将被推送到事件队列中,每个请求由单个线程处理,但是这个线程只会提交请求并移动到下一个请求,等等,从不等待响应。一旦请求被处理,相应的回调函数将被执行。
- Wacom stu-430签名捕获速度太慢
- 如何在速度模板中获取LiferayPortlet实例id
- 我想放慢html中进程栏的速度
- Knockout绑定大量数据的速度较慢
- Wordpress:未捕获引用错误:未定义速度
- 即使光标位于屏幕边缘,也可以跟踪鼠标速度
- Css优化谷歌页面速度洞察
- fullcalendar在删除导致浏览器挂起的多个事件时速度较慢
- 录制速度javascript
- Javascript图像数组预加载速度和从内存中删除
- 谷歌地图多边形减慢浏览器速度
- nodejs/ccurlhttp请求与postlerrest客户端相比速度较慢
- 粘性渐弱的导航栏似乎很快
- 从Three.js场景中删除许多对象的速度较慢
- 构建多个图表时,HighCharts加载数据的速度较慢
- jQuery.length()速度含义
- AMD应用程序在浏览器中的加载速度是否快于CommonJS应用程序
- 如何在不影响网站页面速度的情况下在我的网站上使用谷歌字体
- 淡入和淡出闪烁,如果滚动速度很快
- 为什么node.js在单线程时速度很快?