Nodejs深度探秘:event loop的本质和异步代码中的Zalgo问题

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

Nodejs是一个高效的异步服务平台,因此非常适合于开发高并发的后台服务。要满足高并发,后台服务需要做到的是能够及时响应客户端发送过来的请求。这里要注意的是”响应“而不是”完成“,客户端可能要求后台从数据库查询特定数据,后台接收请求后会告诉客户端”你的要求我收到而且正在处理,当我处理完成了再通知你"。由此NodeJS能完成高并发的原因在于,它会将那些耗时长的处理提交给线程池处理,它的主线程则一直响应客户端的请求,等到线程池把耗时就的任务完成,主线程拿到结果后再发送给对应的客户。

因此NodeJS的基本模式是,由一个主线程不断接收客户端请求,如果请求需要一定时间才完成,主线程会将任务丢给线程池,然后继续回头处理其他客户的请求。在主线程的循环中,它会不断的轮询特定队列,看看是否有数据可以处理,如果有那么它就从队列中取下来,然后将数据进行处理后发送给需要的客户端。由于主线程不用长时间阻塞,因此它能够在给定时间内对大量的客户端请求进行响应,这是它能实现高并发的原因。

主线程不断轮询特定队列是否有数据的过程也叫event loop。其基本流程如下:
请添加图片描述
NodeJS代码的特点在于,任何我们自己写的代码,它在执行时一定在主线程中,而且你不用担心因多线程导致的重入等问题。在NodeJS代码中,一旦有异步调用产生,执行流就会将这个调用提交给它的线程池,然后直接指向异步调用后面的代码,例如:

console.log(1)
setTimer(()=>{console.log(2), 0)
console.log(3)

上面代码运行时输出结果是1,3,2,这是因为setTimer是异步函数,在主线程里不会得到执行,主线程会把这个时钟任务交给线程池,等到时钟结束后,里面的回调就会放置在上图中的时钟队列,因此主线程会越过setTimer直接指向它后面的语句,等到主线程下次循环到上图中的时钟队列位置时才会把setTimer设置的回调函数拿出来执行。

由此对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值