Nodejs是一个高效的异步服务平台,因此非常适合于开发高并发的后台服务。要满足高并发,后台服务需要做到的是能够及时响应客户端发送过来的请求。这里要注意的是”响应“而不是”完成“,客户端可能要求后台从数据库查询特定数据,后台接收请求后会告诉客户端”你的要求我收到而且正在处理,当我处理完成了再通知你"。由此NodeJS能完成高并发的原因在于,它会将那些耗时长的处理提交给线程池处理,它的主线程则一直响应客户端的请求,等到线程池把耗时就的任务完成,主线程拿到结果后再发送给对应的客户。
因此NodeJS的基本模式是,由一个主线程不断接收客户端请求,如果请求需要一定时间才完成,主线程会将任务丢给线程池,然后继续回头处理其他客户的请求。在主线程的循环中,它会不断的轮询特定队列,看看是否有数据可以处理,如果有那么它就从队列中取下来,然后将数据进行处理后发送给需要的客户端。由于主线程不用长时间阻塞,因此它能够在给定时间内对大量的客户端请求进行响应,这是它能实现高并发的原因。
主线程不断轮询特定队列是否有数据的过程也叫event loop。其基本流程如下:

NodeJS代码的特点在于,任何我们自己写的代码,它在执行时一定在主线程中,而且你不用担心因多线程导致的重入等问题。在NodeJS代码中,一旦有异步调用产生,执行流就会将这个调用提交给它的线程池,然后直接指向异步调用后面的代码,例如:
console.log(1)
setTimer(()=>{console.log(2), 0)
console.log(3)
上面代码运行时输出结果是1,3,2,这是因为setTimer是异步函数,在主线程里不会得到执行,主线程会把这个时钟任务交给线程池,等到时钟结束后,里面的回调就会放置在上图中的时钟队列,因此主线程会越过setTimer直接指向它后面的语句,等到主线程下次循环到上图中的时钟队列位置时才会把setTimer设置的回调函数拿出来执行。
由此对

本文深入探讨了Node.js如何利用异步处理实现高并发,特别是其Event Loop机制。主线程通过接收客户端请求并将其耗时任务提交给线程池,然后继续处理其他请求。Event Loop包括多个阶段,如Timer、Poll和Check,每个阶段处理不同类型的回调。文中还举例说明了不当使用同步和异步可能导致的Zalgo问题,并强调了避免同步和异步混用的重要性。
最低0.47元/天 解锁文章
2060

被折叠的 条评论
为什么被折叠?



