Pau*_*han 12 javascript node.js
尽管是单线程的,但node.js如何更快?我没有运行任何测试来查找统计信息,但在挖掘node.js论坛时,我发现每个人都说它更快更轻.但无论它的重量如何轻,单线程服务器如何比多线程服务器更快?
Den*_*ret 24
首先,为什么多线程程序更快?
部分原因是多线程程序可以在多个内核上运行,但到目前为止,主要原因是当一个线程正在等待某些IO操作时(这种情况经常发生,特别是在服务器中),其他线程仍然可以进步.
现在,节点怎么样?
节点不是单线程的.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
Run Code Online (Sandbox Code Playgroud)
node(和io.js)的整个架构使得具有高水平的并行性变得简单.用户线程仅由事件循环调用,用于非常短的任务,当您的代码向节点提供将在操作完成时调用的回调时,该任务在下一个IO操作(嗯,实际上不是IO,但最常见)停止.
当然,这仅在您使用Node的异步功能时才有效.每当你使用像" writeFileSync "这样的"Sync"结尾的函数时,你就会破坏并发性.
Node.js不是单线程的:请参阅https://nodejs.org/about/:
任何连接都可以同时处理
实际上,它不使用系统线程,而是使用V8引擎和libuv库通过异步回调进行多线程处理.
此外,您可以通过child_process.fork使用其他子进程
最后,这不会以任何方式调节响应速度或发动机的整体速度.多线程就是可扩展性.
| 归档时间: |
|
| 查看次数: |
4702 次 |
| 最近记录: |