高并发场景下的对比:
nodejs具有单线程、非阻塞IO、事件循环/驱动的特点,所以在高并发场景下,线程占用cup处理资源,cup不用等待IO的处理过程,而是不停的的发起异步请求,在异步处理结束后继续下一步异步任务。所以不会出现线程阻塞。如图1所示。
优势:
cpu利用率较高,因为cpu不用等待IO,而时一直在发起异步请求。
不足:
单个线程崩溃后,所以任务都无法进行,而多线程并发场景下,某个线程崩溃,不影响其他线程任务
类似Java的后台则通过多线程处理高并发任务,某个线程在进行IO时,cpu总是会等待IO处理结束后继续下一个任务,当然在某个线程处理时,其他线程只能等待这个线程处理结束,这就是线程阻塞。如图1所示。
图1:
所以,同意内存大小的服务器,异步事件的高并发连接要多于多线程并发连接。
Node事件驱动和事件循环
图2:
如图2所示:
- Node只有一个主线程执行代码,形成一个执行栈。
- 在主线程中还维护一个事件队列,将所有网络请求和异步IO放在事件队列中。
- 直到主线程的代码执行完成以后,会通过事件循环机制来检查事件队列中是否有待处理任务。
- 事件循环机制会将事件队列中的任务分为两种情况:非IO任务、IO任务。
- 对于非IO任务主线程会亲自执行,然后通过回调函数返回给上层调用;对于IO任务,Node会从底层的线程池中分配一个线程来执行这个IO任务事件,执行完成后将事件的回调函数放在任务队列尾部,等待事件循环机制下,主线程的亲自执行后返回给上层调用(后半部分类似于非IO任务事件的执行)。
适用场景:
Node更加适用于IO密集型场景,如sql请求、文件读取、HTTP请求等。
但对于cpu计算密集型场景,由于是单线程的处理,所以相对于多线程计算会显得弱势。
所以Node常用于像聊天室等简单逻辑的业务应用。