仿Muduo库实现高并发服务器——Server.hpp框架的简单描述

news2024/11/24 20:50:46

EventLoop模块在本项目中的简单使用:

        下面这张图 是channel模块,poller模块,TimerWheel模块,EventLoop模块,LoopThreadPool模块进行组合。便于大家对这个项目的理解,因为代码看起来挺复杂的。

下面这个图,加入了Connection模块,Buffer模块,socket模块,Acceptor模块,Tcpserver模块。

算是将server.hpp,进行了框架描述。 

小故事便于理解: 

        我会再反复思考,再对这个故事进行修正,以便大家能更好的理解。

        这个故事是对现实社会中的关系进行映照,不知道这句话恰不恰当。

        这个故事有点长,但是肯定可以让你对这个项目有更好的理解。 这个故事只能讲述大概框架,具体还要看各个模块代码的讲解。

角色:

channel(打工仔),poller(人事部门),EventLoop(大领导),LoopThreadPool(领导管理部门),TimerWheel(定时任务部门)

故事讲起:

        首先,打工仔们(channel对象)想维持生计,就必须要去打工(就是Connection模块 设置的回调函数),但是又不知道在哪里打工,于是,遇到了一位大领导,这个大领导就说,我们这里招人,你去人事部门办理一下手续,登记一下(就是将Channel对象 存储到一个容器中),然后你就可以工作,去维持生计。大领导还告诉打工仔,你想做什么事,你告诉我,我帮你调。

        人事就告诉打工仔,boss不是告诉你,你可以做那些回调事件了嘛,你等着,等那些事件能做了我就通知你。

        民间兴起了一个组织,叫定时任务部门(定时器TimerWheel),这个组织中经常在规定时间(需要自行设置根据自己需要)中,完成一件事情。组织从有一辆大巴,承载人数不等,通常一天大巴出发多少次是固定的(比如说60s,每一秒执行一些事件,但是一秒钟,不是都在执行事件,事件执行完之后,调度器就会做别的事),但是也有可能会有某个小托拉(就是这一组任务执行事件超出一秒钟),拖着你的时间,导致这趟车出去办事的时间有点长,超时了。后面的人还在焦急的等着,于是大巴回去,不休息,接着出发,知道弥补回来小托拉拖延的时间。

        但是司机也不知道要出几次车,才能弥补回来。于是,该部门就专门有个人来管理,这个人就知道,需要出多少次车,通知这个司机,司机就去出,知道弥补回来为止。

        有一天,定时任务部门(定时器TimerWheel) 领导人发现,这样做没什么效益,于是,在网上看到了大领导(EventLoop),大领导就会用人才,将这个部门设置为自己的直接下属,只听自己调遣。但是定时任务部门 还是只有一辆车(定时任务存储容器 std::vector<PtrTask>一趟车出去要办事的人),但是部门领导人向大领导反应之后,大领导就说,你让你那个通知司机的人 (通知司机的人就说 TimerWheel 模块中创建的 定时事件文件描述符)去人事部登记一下,人事部在去通知你(等到定时器文件描述符上面有任务了,就调用TimerWheel模块中设置的回调函数,进行处理),你再去通知司机。

        大领导肯定要知道 定时任务部门 的运作以及成员的职能。

        定时任务部门(定时器TimerWheel)也要管理人员流动,招聘新人(添加TimerTask),辞退老员工(删除TimerTask)。

        但是大领导也有自己的活做,而且这些活,只能大领导来做,其他人没这个权利。大领导在做活时,要有个小秘书,这个小秘书来提醒大领导。小秘书,用甜人的声音,去叫醒大领导。领导,快起来干活了。

        这个小秘书(Eventloop中创建的事件通知描述符)怎么知道有活的,你猜的没错,她也去人事那里注册了,有活之后,人事通知,小秘书,小秘书去叫醒大领导,领导再去完成任务。

首先,整个社会的运作,可不能只有一位大领导,于是就要了管理大领导(EventLoop)的组织,领导管理部门(线程池)。

        这个部门就决定着这个社会需要几位领导人,每个领导人都需要,领导管理部门签发的线程,你没有这个线程,你就不能当大领导,就不能有小秘书等。所以说线程和大领导是绑在一起的。

        这些大领导(EventLoop),都是有傲气的。群龙无首可不行,于是就有了主线程 (主线程也是个EventLoop),主线程就是将客户连接以某种形式分配负载均衡,本项目中采用轮询分配)给这些大领导,在领导将他们变成打工仔,交给人事部门。

        当领导始终执行  (线程执行完线程函数之后就会退出,但是你就这几个线程,退出一个少一个,于是就用死循环,让大领导始终执行)自己的任务,如果这个社会不存在(程序退出)了,大领导(EventLoop也就没有存在的必要,他手下的那些部门和小秘书也将不会存在)也将不会存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024河南萌新联赛第六场题解

这场的出题组是郑州大学acm实验室&#xff0c;验题组是郑州大学和郑州轻工业大学的志愿者同学们。 官方题解大部分内容是我写的&#xff0c;B题思路部分是对应的出题人自己写的&#xff0c;E题思路以及代码都是对应的出题人写的因为我不会写这个题&#xff0c;题目的题面&…

C++--类和对象(三)

本篇主要是填补前两篇类和对象中的小知识点 第一篇:C--类和对象&#xff08;一&#xff09;-CSDN博客 第二篇:C--类和对象&#xff08;二&#xff09;-CSDN博客 目录 1.初始化列表 2.友元&#xff08;friend&#xff09; 3.内部类 1.初始化列表 在之前实现构造函数的时候&a…

uniapp 总结

uniapp的 发送请求的 responseType是没有 blob这个类型的&#xff0c; responseType: ‘arraybuffer’, uniapp 标准js和浏览器js的区别 downloadFile的原理作用

从零开始学习SLAM(五):极几何与极约束

文章参考计算机视觉life 前备知识 概念 几何关系&#xff1a; 上图中&#xff1a; 极平面&#xff08;Epipolar plane&#xff09;&#xff1a;点c0, c1, p三点确定的平面&#xff1b; 极点&#xff08;Epipoles&#xff09;&#xff1a; c0 c1 连线与两个平面的交点 基线&a…

SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】

1. 配置准备 1.1 理解平行账概念 平行账&#xff0c;也称为多分类账&#xff0c;是SAP系统中的一项功能&#xff0c;它允许企业按照不同的会计准则来维护各自的财务数据。这种设置特别适用于那些需要符合多种会计准则的跨国公司。通过平行账&#xff0c;企业可以在不同的分类…

单片机存储芯片 W25QXX、AT24C02

一、FLASH W25QXX (1) W25QXX芯片简介 W25Q128是华邦公司推出的一款SPI接口的NOR Flash芯片&#xff0c;其存储空间为128Mbit&#xff0c;相当于16M字节。W25Q128V芯片是串行闪存&#xff0c;可以通过标准/两线/四线SPI控制。W25Q128一次最多可编程256个字节。页面可以按扇区擦…

特斯拉算法,暴力递归尝试,汉诺塔问题

改进之后的算法 暴力递归就是尝试 汉诺塔问题 主函数 打印一个字符串的全部子序列&#xff0c;包括空字符串

【数据结构题集(c语言版)】内部排序算法比较 题解(起泡排序+直接插入排序+简单选择排序+快速排序+希尔排序+堆排序)

内部排序算法比较 问题描述 在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 基本要求 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排…

SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)

Spring Boot 项目中使用 Spring Data Redis 实现地理坐标(Geospatial) 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Sup…

JVM 有哪些垃圾回收器?

JVM 有哪些垃圾回收器&#xff1f; 图中展示了7种作用于不同分代的收集器&#xff0c;如果两个收集器之间存在连线&#xff0c;则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 新生代收集器&#xff08;全部的都是复制算法&#xff09;&…

使用 Charles 模拟手机弱网测试

在移动互联网时代&#xff0c;网络状况的不确定性给应用程序带来了挑战。尤其是在偏远地区或信号不佳的地方&#xff0c;用户的网络连接可能会变得不稳定。因此&#xff0c;对应用程序进行弱网测试变得尤为重要。Charles Proxy 是一款广泛使用的网络调试工具&#xff0c;它不仅…

分享小诗梦404炫酷单页面html5源码

源码介绍 分享小诗梦404炫酷单页面html5源码&#xff0c;小诗梦的一个很炫酷页面&#xff0c;感觉应该符合一些人的感觉&#xff01;可以用来做404页面。 源码下载 分享小诗梦404炫酷单页面html5源码

C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {int ans INT_MIN;int m matrix.size(), n matrix[0].size();for (int i 0; i < m; i) { // 枚举上边界vector<int> sum(…

SAP凭证分割【Document Splitting】

在SAP系统中&#xff0c;凭证分割&#xff08;Document Splitting&#xff09;是一种用于在财务会计模块中特别是总帐会计中进行更细粒度的财务报表分析的技术。通过凭证分割&#xff0c;可以按照不同的标准&#xff08;如成本中心、利润中心、公司代码等&#xff09;对会计凭证…

C语言 | Leetcode C语言题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; int maxSumSubmatrix(int** matrix, int matrixSize, int* matrixColSize, int k){int preSum[matrixSize][*matrixColSize];for(int i0; i<matrixSize; i){preSum[i][0] matrix[i][0];}for(int i0; i<matrixSize; i){for(int j1; j…

Funsound语音识别技术之 语音识别多路并发转写

免费语音识别转写&#xff08;优于讯飞&#xff09;&#xff1a;www.funsound.cn Funsound语音识别工具包&#xff1a;https://github.com/pika-online/Funsound/tree/main 1. 前言 本文主要介绍一种简单的多路语音识别转写部署方案&#xff0c;基于多线程开发实现后台同时转…

總結熱力學_2

個人近況 在考慮廷畢的選課情況&#xff0c;以及更改教資的科目三&#xff1a;比如由物理改為音樂 在看<<怪談直播間>>&#xff0c;顧毅的第五關太長了... <<詭舍>>不知道&#xff0c;三下鄉完了就没看了 參考: 陈曦<<热力学讲义>>ht…

甄选范文“论软件体系结构的演化”软考高级论文,系统架构设计师论文

论文真题 软件体系结构的演化是在构件开发过程中或软件开发完毕投入运行后,由于用户需求发生变化,就必须相应地修改原有软件体系结构,以满足新的变化了的软件需求的过程。体系结构的演化是一个复杂的、难以管理的问题。 请围绕“论软件体系结构的演化”论题,依次从以下三…

Array List集合的基本使用

数组&#xff1a;长度固定 集合&#xff1a;自动扩容 数组&#xff1a;可以存基本数据类型&#xff0c;可以存引用数据类型 集合&#xff1a;可以存引用数据类型&#xff0c;不可以存基本数据类型&#xff08;要换成对应的包装类&#xff09; package ArrayListDemo;import j…

Java | Leetcode Java题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int ans Integer.MIN_VALUE;int m matrix.length, n matrix[0].length;for (int i 0; i < m; i) { // 枚举上边界int[] sum new int[n];for (int j i; j <…