Event Loop
什么是Event Loop
Event Loop是一个重要的概念,指的是计算机系统的一种运作机制。
JavaScript 语言就采用的这种机制,来解决单线程运行带来的一些问题。
然而想要理解Event Loop要从进程说起(运行以后的程序叫做进程),且一般情况下一个进程一次只能执行一个任务。
所以解决很多任务执行无外乎三种方法
1、排队。因为一个进程只能一次执行一个任务,就等前面的任务完成后,再进行后面的任务执行
2、新建进程。使用fork命令,为每个任务新建进程
3、新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务。
由于JavaScript是一个单线程语言,所有的任务都是在一个线程上完成的,所以一旦遇到大量任务,或者一个非常耗时的任务时,网页就会出现“假死”现象,因为JS还在运行中,且无法响应用户行为。
由于JS从设计时就不想令其太过复杂且占用太多资源。所以后来也就约定俗成了一种单线程语言。
如果某个任务很耗时或者有许多I/O(输入/输出)操作,那么运行的状态大概是如下图
绿色是程序运行时间,红色是等待时间。由图可看出由于I/O操作很慢,所以大部分时间都是在等I/O的返回结果,这种方式被称为‘同步模式(synchronous I/O)’or ‘阻塞模式(blocking I/O)’。
如果采用多线程
如图所显示 ,多线程工作不但占用了多倍资源的同时也闲置了许多资源,这样显然也是十分的不合理
所以Event Loop 就是为了解决这个问题而被提出的。
Event loop 是一个程序结构,用于等待和发送消息和事件
就是在程序中设置两个线程:一个专门负责程序本身的运作,称之为主线程,另一个负责主线程与其他进程的通信(主要是各种I/O操作),被称为Event Loop线程(也可以意为‘消息线程’)。
上图中主线程的绿色部分,表示运行时间,而橙色部分表示空闲时间。每当遇到I/O程序后就让Event Loop通知相应的I/O程序,然后主线程继续进行,所以不存在等待时间。等到I/O完成操作Event Loop再把返回结果给主线程,主线程再去调用事先定好的回调函数,就可以完成该任务。
看图可得知,由于主线程多出了许多橙色的空闲的时间,因而可以运行更多的任务,这便大大提高了效率。这种方式被称为异步模式或者非阻塞模式。
因而单线程虽然是JS的优势同时也是Js 的劣势,虽然对其构成了较大的限制,但也具备了其他语言所不具备的优势。如果部署的好JS是不会出现堵塞的。这也是为什么node.js可以用较少的资源来应对大流量访问的原因。