从epoll构建muduo-3 加入第一个类,顺便介绍reactor

mini-muduo版本传送门
version 0.00从epoll构建muduo-1 mini-muduo介绍
version 0.01从epoll构建muduo-2 最简单的epoll
version 0.02从epoll构建muduo-3 加入第一个类,顺便介绍reactor
version 0.03从epoll构建muduo-4 加入Channel
version 0.04从epoll构建muduo-5 加入Acceptor和TcpConnection
version 0.05从epoll构建muduo-6 加入EventLoop和Epoll
version 0.06从epoll构建muduo-7 加入IMuduoUser
version 0.07从epoll构建muduo-8 加入发送缓冲区和接收缓冲区
version 0.08从epoll构建muduo-9 加入onWriteComplate回调和Buffer
version 0.09从epoll构建muduo-10 Timer定时器
version 0.11从epoll构建muduo-11 单线程Reactor网络模型成型
version 0.12从epoll构建muduo-12 多线程代码入场
version 0.13从epoll构建muduo-13Reactor + ThreadPool 成型

mini-muduo v 0.02版本,这个版本添加的内容非常少,完整可运行的示例可从github下载,使用命令git checkout v0.02可切换到此版本,在线浏览到这里

  1. #include"TcpServer.h"
  2. intmain(intargs,char**argv)
  3. {
  4. TcpServertcpserver;
  5. tcpserver.start();
  6. return0;
  7. }

1 TcpServer作为第一个对象加入进来,以后main里面就只需要写几句简单的调用,主要逻辑从main函数移到了TcpServer里,一般来说全局只需要创建一个TcpServer的对象,然后通过调用TcpServer::start()启动整个服务器程序。


本版代码没太多好说的,正好借这个空记录下reactor模式,因为muduo就是使用的reactor模式,尽早了解这个模式可以帮助我们更好的理解代码。通过查看wikipedia,可以看到很多语言都有reactor模式的网络库,典型的比如Python写的Twisted。通过对比reactor和muduo的代码,发现muduo并没有完全按照文章介绍的类来组织程序,有一些小改动,后面每个版本增加新代码时会对照一下reactor的标准模板。

我参考的reactor模式来源是Douglas C. Schmidt一篇paper,下面是pdf连接

An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events

文章对reactor模式进行了讲解,我把最主要的部分摘抄出来

1 reactor的类图结构:


2 主要类介绍:

Handles

操作系统管理的某种资源,比如socket描述符,Synchronous Event Demultiplexer可以在多个Handle上等待事件的发生,比如等待socket的读写事件。

Synchronous Event Demultiplexer

用来在多个Handle上等待事件发生,在Linux平台上就是select/poll/epoll函数了。

Initiation Dispatcher

提供给应用程序使用,应用程序借助Initiation Dispatcher可以在Handle上注册或者注销监听。

Event Handler

这是一个接口,应用程序实现满足这个接口的类,然后通过Initiation Dispatcher将这个类注册到Handle上

Concrete Event Handler

这是应用程序实现的,满足Event Handler接口的类,通常来说,服务器程序会有两个最典型的Concrete Event Handler,原文中一个叫做Logging Acceptor,另一个叫做Logging Handler,Logging Acceptor负责创建并且注册Logging Handlers,Logging Handler处理读写事件。


3 类之间的协作关系:

1 当应用程序注册一个Concrete Event Handler到Initiation Dispatcher的时候,应用程序指定关注的事件类型

2 Initiation Dispatcher需要每个Event Handler回传它内部的Handle

3 当所有的Event Handler注册好后,应用程序调用handle_events来启动事件循环,此时Initiation Dispatcher使用Synchronous Event Demultiplexer在Handles集合上等待。

4 当某个Handle上有事件发生时,Synchronous Event Demultiplexer通知Initiation Dispatcher

5 Initiation Dispatcher使用Handler作为key来找到某个Event Handler

6 Initiation Dispatcher调用Event Handler的handle_event()方法


4 时序图

相关文章

react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接...
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc ...