Function event_driven

Source
pub fn event_driven()
Expand description

§事件驱动编程模型

因为处理 I/O 复用的编程模型相当复杂,为了简化编程,引入了下面两种模型。

  • Reactor(反应器) 模式,对应同步I/O,被动的事件分离和分发模型。服务等待请求事件的到来,再通过不受间断的同步处理事件,从而做出反应。
  • Preactor(主动器) 模式,对应异步I/O,主动的事件分离和分发模型。这种设计允许多个任务并发的执行,从而提高吞吐量;并可执行耗时长的任务(各个任务间互不影响)。

Reactor Model:

                                                     +----------------+
req                                        Dispatch  |                |
+------+                                  +--------> | req handler    |
|      |                                  |          +----------------+
|      | +----+                           |
+------+      | event    +------------+   |
              |          |            |   |
              +--------> |  Service   |   |Dispatch  +----------------+
                         |  Handler   +------------> |                |
req          +---------> |            |   |          | req handler    |
+------+     |           +------------+   |          +----------------+
|      |     | event                      |
|      +----+                             |
+------+                                  | Dispatch +----------------+
                                          +--------->+                |
                                                     | req handler    |
                                                     +----------------+

三种实现方式:

  • 单线程模式。 accept()、read()、write()以及connect()操作 都在同一线程。
  • 工作者线程池模式。非 I/O 操作交给线程池处理
  • 多线程模式。主Reactor (master) ,负责网络监听 , 子Reactor(worker) 读写网络数据。

读写操作流程:

  1. 应用注册读写就绪事件和相关联的事件处理器
  2. 事件分离器等待事件发生
  3. 当发生读写就绪事件,事件分离器调用已注册的事件处理器
  4. 事件处理器执行读写操作

参与者:

  1. 描述符(handle):操作系统提供的资源,识别 socket等。
  2. 同步事件多路分离器。开启事件循环,等待事件的发生。封装了 多路复用函数 select/poll/epoll等。
  3. 事件处理器。提供回调函数,用于描述与应用程序相关的某个事件的操作。
  4. 具体的事件处理器。事件处理器接口的具体实现。使用描述符来识别事件和程序提供的服务。
  5. Reactor 管理器。事件处理器的调度核心。分离每个事件,调度事件管理器,调用具体的函数处理某个事件。