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) 读写网络数据。
读写操作流程:
- 应用注册读写就绪事件和相关联的事件处理器
- 事件分离器等待事件发生
- 当发生读写就绪事件,事件分离器调用已注册的事件处理器
- 事件处理器执行读写操作
参与者:
- 描述符(handle):操作系统提供的资源,识别 socket等。
- 同步事件多路分离器。开启事件循环,等待事件的发生。封装了 多路复用函数 select/poll/epoll等。
- 事件处理器。提供回调函数,用于描述与应用程序相关的某个事件的操作。
- 具体的事件处理器。事件处理器接口的具体实现。使用描述符来识别事件和程序提供的服务。
- Reactor 管理器。事件处理器的调度核心。分离每个事件,调度事件管理器,调用具体的函数处理某个事件。