浏览器中的js是单线程的,node也是单线程的。这个单线程至关于一个大管家,一切大小事务都要通过他的手才能办成,它老是把IO任务放入到任务池中。
虽说是单线程,可是node也有一个线程池专门负责执行任务池中的任务,它们把任务完成以后会告知主线程以接下来利用CPU完成处理。
关键在于理清哪些任务是主线程作的,哪些任务是线程池作的。
对于IO操做(例如文件读取、数据库读取、网络请求等),基本所有是线程池完成的(IO操做也有阻塞式的写法);对于计算任务,都是主线程完成的。
不要小看IO操做占用的时间,node的重要优点就是把IO操做放到了主线程以外,从而让主线程腾出手来去处理更多的请求。
node的线程池基于libuv这个库。node
node技术的底层依赖:python
以python为例,gunicorn服务器能够指定worker数,表示能够同时处理的任务数。即使这些任务都是CPU密集型操做,gunicorn也可以最多支持和worker数相等的请求。而node最多只能支持一个CPU密集型任务。
简言之,node至关于一个worker,可是这个worker效率比较高(由于把IO和计算分离开了)。
实际上,node能够经过开不少个进程,经过nginx负载均衡来实现多个worker,这样彻底能够达到和其它语言相同的效果。
简言之,开多个worker谁都会。node的优点在于这个优秀的单线程。
开多个worker应该是优化的最后一步,是实在想不出更好办法以后的办法。node的创新之处就在于IO和计算分离,从而将并发量提升了许多。
IO和计算分离是一种思想,并不是只能用js实现,其它语言也能够借鉴。nginx
cluster模块已经成为node的标准模块了,这个模块赋予了node多worker的能力。使用nginx+多个实例的方法须要占用多个端口,cluster则可以让多个worker共用同一端口。
原来的单线程模型处理计算密集型任务的线程只有一个,即主线程;处理IO的线程有多个。如今cluster经过开辟多个处理计算密集型任务的线程实现了多worker。web
一篇cluster的详细讲解
https://blog.csdn.net/leohzj/article/details/50462231数据库