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

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.mzph.cn/web/50997.shtml

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

相关文章

招募活动投稿展示 | 感受科技温度,从一个 LLM 应用开始

活动介绍 谷歌开发者招募活动是专为 Google 技术的爱好者及开发者们开展的活动&#xff0c;旨在鼓励大家通过多种形式 (文章/视频/coding 等) 创作与 Google 技术相关的讲解分享、实践案例或活动感受等内容&#xff0c;展示代码、框架、平台在真实世界中的生动表现&#xff0c;…

详解Spring Bean的生命周期

详解Bean的生命周期 前言 在我们没有使用Spring框架之前&#xff0c;创建对象一般都是使用new关键字进行创建&#xff0c;当然除了new关键字外&#xff0c;还有 运用反射手段&#xff0c;使用Class类的newInstance方法 或者 Constructor类中的newInstance方法使用clone方法使…

JavaScript语法基础之DOM基础

目录 1. DOM 基础 1.1. DOM 是什么&#xff1f; 1.1.1. DOM 对象 1.1.2. DOM 结构 1.2. 节点类型 1.3. 获取元素 1.3.1. getElementById() 1.3.2. getElementsByTagName() 1.3.3. getElementsByClassName() 1.3.4. getElementsByName() 1.4.如何去操作对象 修改属性…

IP SSL证书的未来趋势:适应不断变化的安全挑战

随着网络攻击手段的不断进化和用户对隐私保护意识的增强&#xff0c;IP SSL证书作为保障网络安全的关键组件之一&#xff0c;也在不断地发展和完善。本文将探讨IP SSL证书的未来趋势&#xff0c;以及如何适应这些不断变化的安全挑战。 当前状况与挑战 网络安全意识提升&#…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

python-docx 实现 Word 办公自动化

前言&#xff1a;当我们需要批量生成一些合同文件或者简历等。如果手工处理对于我们来说不仅工作量巨大&#xff0c;而且难免会出现一些问题。这个时候运用python处理word实现自动生成文件可极大的提高工作效率。 python-docx是python的第三方插件&#xff0c;用来处理word文件…

Kubectl命令、初识pod、namespace

文章目录 一、Kubectl简介基础命令1.基本信息命令2.创建和更新资源命令3.删除资源命令4. 查看日志和调试命令5. 端口转发和复制文件命令6. 部署管理命令7. 伸缩命令8. 配置和上下文管理命令9.常用命令 二、Pod简介核心概念pod常见状态调度和初始化阶段容器创建和运行阶段异常状…

Qt网络通信——TCP和UDP

一、TCP通信 TCP通信必须先建立 TCP 连接&#xff0c;通信端分为客户端和服务器端。 Qt 为服务器端提供了 QTcpServer 类用于实现端口监听&#xff0c;QTcpSocket 类则用于服务器和客户端之间建立连接。大致流程如下图所示&#xff1a; 1. 服务器端建立 1.1 监听——listen() …

PPP简介

介绍PPP特性的定义和目的。 定义 PPP&#xff08;Point-to-Point Protocol&#xff09;协议是一种点到点链路层协议&#xff0c;主要用于在全双工的同异步链路上进行点到点的数据传输。 目的 PPP协议是在串行线IP协议SLIP&#xff08;Serial Line Internet Protocol&#x…

代码随想录:动态规划6-10

62、不同路径 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径…

史上最全的软件工厂考试简答题教程

软件工程考试简答题 1. 有人认为软件开发时&#xff0c;一个错误发现得越晚&#xff0c;为改正它所付出的代价越大。提出你的观点并解释原因&#xff1f; &#xff08;1&#xff09;在软件开发的不同阶段进行修改付出的代价是很不相同的&#xff0c;在早期引入变动&#xff0c…

openai whisper使用

whisper使用 介绍 Whisper是一种通用的语音识别模型。它是在大量不同音频数据集上训练的&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别、语音翻译和语言识别。 GitHub&#xff1a;https://github.com/openai/whisper 论文链接&#xff1a;https://arx…

注册Github账号详细过程

目录 一、准备工作 二、注册步骤 一、准备工作 在注册GitHub账号之前&#xff0c;请确保您已经准备好以下信息&#xff1a; 一个有效的电子邮箱地址&#xff1a;用于接收验证邮件和GitHub的后续通知。 用户名&#xff1a;确保该用户名在GitHub上是唯一的&#xff0c;且符合…

turtle画图知识

Turtle库是Python编程语言中的一个库&#xff0c;用于创建各种类型的图形&#xff0c;包括简单圆形、线条、路径和图片。它支持多种图形类型&#xff0c;并且可以绘制出各种复杂的形状。 以下是一些基本的使用方法&#xff1a; 1. 创建一个新的Turtle对象&#xff1a; pytho…

Leetcode JAVA刷刷站(53)最大子数组和

一、题目概述 二、思路方向 这个问题是一个经典的算法问题&#xff0c;称为“最大子序和”&#xff08;Maximum Subarray Problem&#xff09;。解决这个问题的一个高效方法是使用“Kadanes Algorithm”&#xff0c;它只需要遍历数组一次&#xff0c;就能在 O(n) 时间复杂度内…

CVPR2023《DNF: Decouple and Feedback Network for Seeing in the Dark》暗光图像增强论文阅读笔记

相关链接 论文链接 https://openaccess.thecvf.com/content/CVPR2023/papers/Jin_DNF_Decouple_and_Feedback_Network_for_Seeing_in_the_Dark_CVPR_2023_paper.pdf 代码链接 https://github.com/Srameo/DNF 摘要 RAW数据的独特属性在低光照图像增强方面展现出巨大潜力。…

C语言典型例题47

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题3.7 输入4个整数&#xff0c;要求按照从小到大的顺序输出 4个数之间进行比较&#xff0c;冒泡排序最最最详细过程&#xff0c;如果想更改为任意数之间相互比较&#xff0c;只需要修改两个地方&#xff08;数组大…

力扣面试经典算法150题:买卖股票的最佳时机 II

买卖股票的最佳时机 II 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a;买卖股票的最佳时机 II。 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 问…

教程:postman的平替hoppscotch,又叫postwoman,hoppscotch的docker-compose安装过程

目录 1. 背景2. 前期准备2.1 准备docker-compose文件&#xff0c;两个版本&#xff0c;一个3合1&#xff0c;一个分开2.1.1 3合1版本&#xff08;推荐&#xff09;2.1.2 独立版本 2.2 准备安装nginx-proxy-manager&#xff08;可选&#xff09;2.2 准备.env文件2.2.1 默认ip的.…

Spring Boot OAuth2.0应用

本文展示Spring Boot中&#xff0c;新版本OAuth2.0的简单实现&#xff0c;版本信息&#xff1a; spring-boot 2.7.10 spring-security-oauth2-authorization-server 0.4.0 spring-security-oauth2-client 5.7.7 spring-boot-starter-oauth2-resource-server 2.7.10展示三个服务…