ZhangYang's Blog

Event Loop

概念

Event Loop 是一个很重要的概念,指的是计算机系统的一种运行机制

JavaScript语言就采用这种机制,来解决单线程运行带来的一些问题

运行以后的程序叫做”进程”(process),一般情况下,一个进程一次只能执行一个任务

进程

很多任务需要执行,解决方法

1.排队。因为一个进程一次只能执行一个任务,只好等前面的任务执行完了,再执行后面的任务

2.新建进程。使用fork命令,为每个任务新建一个进程。

3.新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务

JavaScript线程

JavaScript为一种单线程语言,所有任务都在一个线程上完成,即采用排队方法

单线程

某个任务很耗时,比如涉及很多I/O(输入/输出)操作,线程的运行如下图,绿色部分是程序的运行时间,红色部分是等待时间

image

由于I/O操作很慢,所以这个线程的大部分运行时间都在空等I/O操作的返回结果

这种运行方式称为”同步模式”(synchronous I/O)或”堵塞模式”(blocking I/O)

多线程

如果采用多线程,同时运行多个任务,那很可能就是下面这样

image

多线程不仅占用多倍的系统资源,也闲置多倍的资源,这显然不合理

Event Loop

“Event Loop是一个程序结构,用于等待和发送消息和事件

简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为”主线程”

另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为”Event Loop线程”(可以译为”消息线程”)

主线程的绿色部分,还是表示运行时间,而橙色部分表示空闲时间

image

每当遇到I/O的时候,主线程就让Event Loop线程去通知相应的I/O程序,然后接着往后运行,所以不存在红色的等待时间

等到I/O程序完成操作,Event Loop线程再把结果返回主线程。主线程就调用事先设定的回调函数,完成整个任务

,由于多出了橙色的空闲时间,所以主线程得以运行更多的任务,这就提高了效率

这种运行方式称为”异步模式”(asynchronous I/O)或”非堵塞模式”(non-blocking mode)