本项目是参考(chenshuo/muduo)实现的一个小型的基于Reactor模型的多线程网络库。
- 操作系统
Ubuntu 20.04.5 LT
- 编译器
g++ 9.4.0
- 项目构建
cmake 3.16.3
- 单元测试
gtest
git clone [https://github.com/Aglargil/GadgetNet](https://github.com/Aglargil/GadgetNet)
cd [GadgetNet](https://github.com/Aglargil/GadgetNet)
mkdir build && cd build
cmake ..
make && make test
事件循环是 GadgetNet 的核心组件,同时也是网络编程的基础。事件循环基于 epoll 和定时器机制实现,可以处理网络 IO 事件和定时器事件。EventLoop
采用单线程模型,即一个线程只有一个EventLoop
对象,通过监听文件描述符的IO时间,来驱动网络库中的其他组件进行相应的操作。****
IO 多路复用器是 GadgetNet 中实现事件循环的关键组件。目前 GadgetNet 支持 epoll 作为 IO 多路复用器,但未来也可能加入对其他多路复用技术的支持。对于 epoll 的封装,GadgetNet 使用了 Channel
和 EpollPoller
两个类。
EventLoopPool
类是一个管理多个 EventLoop
实例的类,用于提高高并发网络应用的性能和可扩展性。它的构造函数允许指定池中的 EventLoop
实例的数量,并且它提供了多个方法来启动、停止和获取 EventLoop
实例。
操作系统中的线程是比较重量级的,它们的创建和销毁都需要耗费很多时间和资源。线程池可以对工作者线程进行复用,通过将线程池的大小设置为适当的值,可以在不降低性能的情况下提高并发能力。
TCP 服务器是 GadgetNet 中最常用的组件之一,用于实现服务器端的网络通信。TcpServer 类用于表示服务器,TcpConnection 类用于表示连接。
TaskNode
是一个可以运行异步任务的类,它可以接收一个函数并异步执行。在执行完成后,可以将执行结果传递给下一个TaskNode
。TaskNode
支持多个任务节点的串行和并行执行,可以构建复杂的任务流程。