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

来源:互联网 发布:乐股软件官网 编辑:程序博客网 时间:2024/05/01 15:37

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-13 Reactor + ThreadPool 成型

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

#include "TcpServer.h"int main(int args, char** argv){    TcpServer tcpserver;    tcpserver.start();    return 0;}

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 时序图