Node单线程高并发原理

1、node是如何处理web请求的

浏览器中的js是单线程的,node也是单线程的。这个单线程至关于一个大管家,一切大小事务都要通过他的手才能办成,它老是把IO任务放入到任务池中。
虽说是单线程,可是node也有一个线程池专门负责执行任务池中的任务,它们把任务完成以后会告知主线程以接下来利用CPU完成处理。
关键在于理清哪些任务是主线程作的,哪些任务是线程池作的。
对于IO操做(例如文件读取、数据库读取、网络请求等),基本所有是线程池完成的(IO操做也有阻塞式的写法);对于计算任务,都是主线程完成的。
不要小看IO操做占用的时间,node的重要优点就是把IO操做放到了主线程以外,从而让主线程腾出手来去处理更多的请求。 node的线程池基于libuv这个库。node

node技术的底层依赖:python

  • V8:Google 推出的 Javascript VM,也是 Node.js 为何使用的是 Javascript的关键,它为 Javascript提供了在非浏览器端运行的环境,它的高效是 Node.js 之因此高效的缘由之一。
  • Libuv:它为 Node.js 提供了跨平台,线程池,事件池,异步 I/O 等能力,是 Node.js 如此强大的关键。
  • C-ares:提供了异步处理 DNS 相关的能力。
  • http_parser、OpenSSL、zlib 等:提供包括 http 解析、SSL、数据压缩等其余的能力。

2、其它语言是如何处理web请求的

以python为例,gunicorn服务器能够指定worker数,表示能够同时处理的任务数。即使这些任务都是CPU密集型操做,gunicorn也可以最多支持和worker数相等的请求。而node最多只能支持一个CPU密集型任务。
简言之,node至关于一个worker,可是这个worker效率比较高(由于把IO和计算分离开了)。 实际上,node能够经过开不少个进程,经过nginx负载均衡来实现多个worker,这样彻底能够达到和其它语言相同的效果。 简言之,开多个worker谁都会。node的优点在于这个优秀的单线程。
开多个worker应该是优化的最后一步,是实在想不出更好办法以后的办法。node的创新之处就在于IO和计算分离,从而将并发量提升了许多。
IO和计算分离是一种思想,并不是只能用js实现,其它语言也能够借鉴。nginx

3、node的优点和劣势

  • node擅长执行IO密集型任务,不善于执行CPU密集型任务。
  • node的效率比传统阻塞式web服务高,为啥之前没有想到使用事件驱动模型把IO和计算进行分离?由于分离是有代价的,node异步模式带来了大量的回调,回调一旦太深,代码可读性极差。
  • node的主线程不能崩,主线程一崩整个服务全挂掉。所以必定要接住异常,这个问题不算劣势,由于很容易解决。

4、node如何实现多个worker

cluster模块已经成为node的标准模块了,这个模块赋予了node多worker的能力。使用nginx+多个实例的方法须要占用多个端口,cluster则可以让多个worker共用同一端口。
原来的单线程模型处理计算密集型任务的线程只有一个,即主线程;处理IO的线程有多个。如今cluster经过开辟多个处理计算密集型任务的线程实现了多worker。web

参考资料

一篇cluster的详细讲解 https://blog.csdn.net/leohzj/article/details/50462231数据库