基于多反应堆的高并发服务器【C/C++/Reactor】(中)主线程反应堆模型的事件添加和处理详解

news2024/11/17 23:42:20

>>服务器和客户端建立连接和通信流程:

基于多反应堆模型的服务器结构图,这主要是一个TcpServer,关于HttpServer,主要是用了Http协议,核心模块是TcpServer。这里边有两种线程:主线程和子线程。子线程是在线程池里边,线程池的每个子线程都有一个反应堆模型,每个反应堆模型都需要有一个TcpConnection

如果这个反应堆实例所属的线程是主线程,主线程是如何在这个反应堆模型里边工作的呢?在服务器端有一个用于监听的文件描述符ListenFd(简写为lfd),基于lfd就可以和客户端建立连接,如果想要让lfd去工作,就得把它放到反应堆模型里边,首先要对lfd封装成Channel类型,之后添加到TaskQueue这个任务队列里边,接着MainEventLoop就会遍历TaskQueue,取出对应的任务节点(ChannelElement),基于任务节点里边的type对这个节点进行添加/删除/修改操作。

补充说明:取出这个节点之后,判断这个节点的类型type,如果type==ADD,把channel里边的文件描述符fd添加到Dispatcher的检测集合中;如果type==DELETE,channel里边的文件描述符fdDispatcher的检测集合中删除;如果type==MODIFY,把channel里边的文件描述符fdDispatcher的检测集合中的事件进行修改。主线程往属于自己的反应堆模型里边放的文件描述符是用于监听的,那么这个lfd肯定是要添加到Dispatcher的检测集合里边,所以操作肯定是添加操作(ADD)。

很显然,这个lfd需要添加到反应堆模型的Dispatcher里边,Dispatcher主要封装了poll/epoll/select模型,不管使用了这三个里边的哪一个,其实都需要对用于监听的文件描述符的读事件进行检测。在检测的时候,如果是epoll模型,它会调用epoll_wait函数; 如果是poll模型,它会调用poll函数;如果是select模型,它会调用select函数;通过这三个函数,传出的数据,我们就能够知道用于监听的文件描述符lfd它对应的读事件触发了。对应的读事件触发了,就可以基于得到的文件描述符(此处为lfd)。通过ChannelMap里边的fdfd其实就是数组的下标)可以找到对应的channel地址,那么基于lfd就可以找到对应的channel地址,就能知道lfd所对应的读事件要干什么。也就是和客户端建立连接,也就可以得到一个通信的文件描述符(cfd)。

首先把用于通信的文件描述符封装成一个Channel类型,接着把channel封装到TcpConnection模块里边。另外,这个TcpConnection模块需要在子线程里边运行的,故需要通过子线程去访问线程池,从线程池找出一个子线程,每个子线程都有一个EventLoop,再把子线程的EventLoop也放到我们封装的TcpConnection模块里边。也就是把子线程的反应堆实例传给TcpConnection模块。

一定要注意:TcpConnection模块里边的EventLoop是属于子线程的,是从子线程传过来的一个反应堆模型的地址。然后就可以在TcpConnection模块里边通过Channel里边封装的通信的文件描述符(cfd)和客户端进行通信,就是接收数据和发送数据。关于通信的文件描述符的事件检测,读事件或者是写事件检测都是通过EventLoop来实现的。

未完待续~

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

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

相关文章

LeGO-LOAM 几个特有函数的分析(2)

接上回LeGO-LOAM 几个特有函数的分析(1) 二、广度优先遍历 广度优先遍历(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。这种算法从树的根(或图的某一指定节点)开始,然后探索…

软件测试|教你如何使用UPDATE修改数据

简介 在SQL(Structured Query Language)中,UPDATE语句用于修改数据库表中的数据。通过UPDATE语句,我们可以更新表中的特定记录或多条记录,从而实现数据的修改和更新。本文将详细介绍SQL UPDATE语句的语法、用法以及一…

selenium 用webdriver.Chrome 访问网页闪退解决方案

1.1.1. 解决方案: 1.1.1.1. 移动插件到谷歌的安装目录下 1.1.1.2. 设置环境变量 1.1.1.3. 重启电脑检查成功 解决时间:5min

Windows系统中Wireshark抓包工具的安装使用

在使用Windows服务器时,如果我们发现网络流量异常或存在异常的外发数据包行为,我们可以利用抓包工具来捕获网络流量包,并对这些流量包进行特征分析,以查看其来源和目的地。通过这些信息,我们可以进一步诊断问题。 以下…

第01章_C语言入门

第01章_C语言入门 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 适合对象 考研同学,且考试科目中包含数据结构等(需要使用C/C写代码)考研同学,考…

EG网关网口连接触控一体机操作说明V1.0 20210809

前言:工业现场中,很多情况下都会使用触摸屏连接PLC这一套设备,此一体机是将触摸屏和PLC两款设备集成到一起,可以简化现场设备结构,方便维护。同时,使用蓝蜂 EG系列网关,可以实现远程在线监控数据…

Unity AVProVideo安卓播放视频问题

Pico4播放全景8K视频播放不了,普通视频也播放不了解决方案: 1.Vulkan去掉,或者优先级放下面2.Pico4打包ARM64,插件里arm64里的几个库都设置arm64,平台选择安卓 Pico其他设置参考官方文档即可。

新手学习易语言中文编程,易语言从入门到精通教学

一、教程描述 本套教程共有100集,并且有大量的课件资料,可能是截止到目前为止,最为全面系统的易语言教程了,其中有些视频是.exe文件,可以下载到本地播放。本套易语言教程,大小14.59G,共有6个压…

凝聚层次聚类及DBscan算法详解与Python实例

凝聚层次聚类及DBscan算法详解与Python实例 凝聚层次聚类DBscan算法实例演示 在本篇博客中,我们将深入探讨凝聚层次聚类(Agglomerative Hierarchical Clustering)和DBscan算法,并通过Python实例演示它们的应用。这两种算法都属于聚…

Es6的Proxy代理是什么?有哪些用法?

一.什么是Proxy? Proxy 对象是ES6新出的一个特性,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。 需要知道的是,在Vue2中双向数据绑定原理(数据劫持&…

《网络是怎样连接的》2.1节图表(自用)

图3.1:协议栈的组成 图3.2:netstat命令查看套接字 上图中每一行就是一个套接字 图3.3:协议栈在浏览器访问DNS服务器与web服务器时的具体工作流程 套接字由协议栈创建 应用程序通过Socket库中的程序组件与协议栈交互 图3.4:TCP头…

【OJ】单链表刷题

力扣刷题 1. 反转链表(206)1.1 题目描述1.2 题目分析1.2.1 头插法1.2.2 箭头反转 1.3 题目代码1.3.1 头插入1.3.2 箭头反转 2.合并两个有序链表(21)2.1 题目描述2.2 题目分析2.3 题目代码 1. 反转链表(206)…

<六>Python的字符串切片及常见操作

字符串的表示 在Python里,可以使用一对单引号、一对双引号或者一对三个双引号、一对三个单引号表示字符串。 a "Im Tom" # 一对双引号 b Tom said:"I am Tom" # 一对单引号c Tom said:"I\m Tom" # 转义字符d Tom said:"…

nginx 一、安装与conf浅析

文章目录 一、安装nginxdocker方式安装linux方式安装Ubuntu 或 Debian 系统:CentOS 或 RHEL 系统: macOS 系统(使用 Homebrew):Windows 系统: 二、nginx.conf浅析 Nginx(发音为“engine-x”&…

有能力,但是不赚钱,往往是因为没有这三个能力!2024最适合创业的细分行业,2024最适合创业的行业

很多人非常有能力,在学校是学霸,在公司是高管,但是出来自己创业就不行了。觉得是自己的能力不够,其实不是你的能力不够,而是你欠缺下面这三种能力。如果你能掌握这三种能力,就算之前是普通人尝试创业&#…

论文阅读_InP-Based_Generic_Foundry_Platform_for_Photonic_Integrated_Circuits

InP-Based_Generic_Foundry_Platform_for_Photonic_Integrated_Circuits 时间:2018年 作者:Luc M. Augustin, Member, IEEE, Rui Santos, Erik den Haan, Steven Kleijn, Peter J. A. Thijs, Sylwester Latkowski, Senior Member, IEEE, Dan Zhao, Wei…

1月5日代码随想录完全二叉树的节点个数

222.完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在…

认识CUDA

1 基本概念 1.1 什么是CUDA? CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 CUDA(Compute Unified Device Arc…

paddlehub 文本检测使用

PaddleHub负责模型的管理、获取和预训练模型的使用。 参考:https://github.com/PaddlePaddle/PaddleHub/tree/develop/modules/image/text_recognition/chinese_text_detection_db_server import paddlehub as hub import cv2 # from utils import cv_show import…

如何使用Plex在Windows系统搭建个人媒体站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…