通常,在计算机中,我们要了解一个事件是否处理完毕有两种思路:
- 轮询方式:不断的轮询事件标志位或者事件完成信号,查看事件是否完成,如果完成,我们就调用事件处理逻辑。
- 事件驱动方式: 发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,并调用事件对应的处理逻辑处理事件。
通俗来说,轮询方式就是你自己在生火做饭,人一直等到火烧旺了,然后开始做饭。事件驱动模型可以理解为你在火炉上安装了个传感器,你生了火,火烧旺了,传感器会提醒你来做饭。
对比一下两种方式:①轮询方式:它可以减少一定的资源损耗,但是处理事件的线程必须要等待事件发生才行,否则一直死等。②事件驱动模型:它虽然耗费了一定的资源,但是它可以解放处理事件的线程,在事件发生之前可以让这个线程干其他事情。
随着计算机内存空间和硬盘空间越来越大,但是CPU的性能瓶颈并没有与计算机空间一样呈线性提升,并且在大多数情况下计算机的空间是用不满的,所以近些年的提示计算机的效率的办法大多数包含“空间换时间”这个思想。
事件驱动模型显然符合上述思想,以下引用O'Reilly 大神关于事件驱动模型解释图:
主要包括4个基本组件:
- 事件队列(event queue):用于接收事件和存储待处理的事件
- 事件分发器(event mediator): 将不同的事件分发到不同的业务逻辑单元
- 事件通道(event channel): 分发器与处理器之间的联系渠道
- 事件处理器(event processor): 实现业务逻辑,处理完成后会返回结果
可以看出,如果采用传统的轮询方式,很容易造成事件处理和接收事件之间逻辑的高度耦合,因为这两者是串行执行的。而事件驱动模型天然解决了这个问题。
最后总结,事件驱动模型相较于轮询具有以下优点:
- 事件处理,事件接收高度解耦,方便拓展事件逻辑处理
- 提高了CPU的执行效率,让CPU不至于空转
- 基于队列暂存事件,加入多个线程可以并行异步处理事件