近些年来响应式编程中的事件驱动模型到底是什么?

34 阅读2分钟

通常,在计算机中,我们要了解一个事件是否处理完毕有两种思路:

  • 轮询方式:不断的轮询事件标志位或者事件完成信号,查看事件是否完成,如果完成,我们就调用事件处理逻辑。
  • 事件驱动方式: 发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,并调用事件对应的处理逻辑处理事件。

通俗来说,轮询方式就是你自己在生火做饭,人一直等到火烧旺了,然后开始做饭。事件驱动模型可以理解为你在火炉上安装了个传感器,你生了火,火烧旺了,传感器会提醒你来做饭。

对比一下两种方式:①轮询方式:它可以减少一定的资源损耗,但是处理事件的线程必须要等待事件发生才行,否则一直死等。②事件驱动模型:它虽然耗费了一定的资源,但是它可以解放处理事件的线程,在事件发生之前可以让这个线程干其他事情。

随着计算机内存空间和硬盘空间越来越大,但是CPU的性能瓶颈并没有与计算机空间一样呈线性提升,并且在大多数情况下计算机的空间是用不满的,所以近些年的提示计算机的效率的办法大多数包含“空间换时间”这个思想。

事件驱动模型显然符合上述思想,以下引用O'Reilly 大神关于事件驱动模型解释图:

事件驱动模型.drawio.png

主要包括4个基本组件:

  • 事件队列(event queue):用于接收事件和存储待处理的事件
  • 事件分发器(event mediator): 将不同的事件分发到不同的业务逻辑单元
  • 事件通道(event channel): 分发器与处理器之间的联系渠道
  • 事件处理器(event processor): 实现业务逻辑,处理完成后会返回结果

可以看出,如果采用传统的轮询方式,很容易造成事件处理和接收事件之间逻辑的高度耦合,因为这两者是串行执行的。而事件驱动模型天然解决了这个问题。

最后总结,事件驱动模型相较于轮询具有以下优点:

  • 事件处理,事件接收高度解耦,方便拓展事件逻辑处理
  • 提高了CPU的执行效率,让CPU不至于空转
  • 基于队列暂存事件,加入多个线程可以并行异步处理事件