首页 > 其他分享 >仿Muduo库实现高并发服务器——Server.hpp框架的简单描述

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

时间:2024-08-22 10:54:28浏览次数:10  
标签:Muduo hpp 领导 Server 线程 模块 EventLoop 小秘书 TimerWheel

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也就没有存在的必要,他手下的那些部门和小秘书也将不会存在)也将不会存在。

标签:Muduo,hpp,领导,Server,线程,模块,EventLoop,小秘书,TimerWheel
From: https://blog.csdn.net/2201_75324712/article/details/141390628

相关文章

  • 仿Muduo库实现高并发服务器——任务定时器模块
    任务定时器模块TimerWheel在本项目中的简单使用:        下面这张图是channel模块,poller模块,TimerWheel模块,EventLoop模块,LoopThreadPool模块进行组合。便于大家对这个项目的理解,因为代码看起来挺复杂的。上面右下角就是定时器模块。TimerTask类的实现:usingTaskF......
  • pgsql登录不上,psql: error: connection to server on socket "/var/run/postgresql/.s
    背景在ubuntu上安装postgres,发现不能直接登录。分析默认是linux系统上的某个对应的用户才能使用对应的pg数据库的用户,因此我们需要作修改。解决编辑以下路径对应的文件,此处的14是版本,不知道的cd过去看看就行了。/etc/postgresql/14/main/pg_hba.conf将下图中对应位置改成m......
  • SQLserver中的增删改查和数据类型
    SQLserver增删查改语句SQLServer是一种关系数据库管理系统,用于存储、管理和检索数据。以下是一些基本的SQL语句,用于在SQLServer中执行增删查改操作:插入数据(Insert)插入完整行:INSERTINTO表名(列1,列2,列3,...)VALUES(值1,值2,值3,...);插入多行:INSE......
  • SQL SERVER IN两个字段
    SQLSERVERIN两个字段随着数据量的不断增长和业务需求的提高,对于数据的查询和分析也越来越复杂。在SQLServer中,使用IN关键字可以方便地查询一个字段中的多个值,但如果需要查询两个字段中的值,该如何操作呢?本文将介绍在SQLServer中使用IN关键字查询两个字段的方法,并给出相应的代......
  • sqlserver left join 后用 on 还是 where?
    昨天写SQLServer数据库上写SQL语句时,我原本想通过执行AleftjoinBon...and...的操作,将查询结果中的两条记录合并成一条,奈何发现结果中依然有两条记录。回顾了一下语法知识,意识到joinon...and...的语句并不会对结果集的记录条数进行过滤。它的主要作用是,根据and后......
  • 针对ShotGun的ServerRewind
    区别虽然也是HitScane,但其可以对多个角色或者多个部位造成伤害更改首先是之前在FFramePackage结构体中,需要增添一个成员变量,用来表示该结构体中的BoxCollision属于哪个敌人。而之前使用的ConfirmHit返回的校验击中头部和身体的结构体,需要为ShotGun创建类似的,其内有两个TMap类......
  • Jumpserver 忘记admin(超级管理员)登录密码——解决方式
    1.登录失败由于各种原因导致多次尝试密码登录失败:2.解决办法2.1查看docker运行的进程[root@jumpserver01~]$dockerps2.2进入jumpserver01这个容器,进行修改账户密码[root@jumpserver01~]$dockerexec-itjumpserver01/bin/bash#如果没有按装django需执行......
  • Docker部署jumpserver
    1.JumpServer概述JumpServer是全球首款完全开源的堡垒机,使用GNUGPLv2.0开源协议,是符合4A的专业运维审计系统。JumpServer使用Python/Django进行开发,遵循Web2.0规范,配备了业界领先的WebTerminal解决方案,交互界面美观、用户体验好。JumpServer采纳分布式架......
  • mysql错误-The server quit without updating PID file
    说明:尽量不要用root用户安装和启动mysql问题示例原因:一般是root用户执行导致,如果MySQL是root以外用户安装的,则用安装的用户执行不会出差固执:这里就是要用root执行。[root@hadoop01mysql]#servicemysqlstartStartingMySQL.Loggingto'/opt/mysql/data/hadoop01.err'.......
  • 记录一次达梦日志报错解析Server page chack error
    数据库宕机,日志报错Serverpagechackerror 很明显是数据页的问题,需要定位到相关表,删除重建根据线程号T0000000000003539136中的 3539136去慢SQL中查对应的脚本下载慢日志,找线程号对应的脚本,用到了11次复制出来脚本,找到对应的表使用DTS把数据迁移到备份表上 再删除......