当前位置: 首页 > article >正文

C++ 服务端进阶(四)—— 多 Reactor + 协程:真正的高并发模型(融合版)

一、这一篇到底在做什么到目前为止你已经分别完成了✔ 第一篇Connection结构抽象✔ 第二篇多 Reactor并发模型✔ 第三篇单 Reactor 协程执行模型但这三者是分开的能力结构 ✔ 并发 ✔ 执行 ✔ 真正的高并发服务端还差最后一步把并发模型多 Reactor和执行模型协程融合本篇目标构建这样一套模型Main Reactoraccept ↓ Sub Reactor线程 协程执行一句话总结本篇多线程负责“并发”协程负责“执行”二、最终架构图必须理解Main Reactor主线程 ↓ accept ┌──────────────┬──────────────┬──────────────┐ ↓ ↓ ↓ Sub Reactor1 Sub Reactor2 Sub Reactor3 (线程1) (线程2) (线程3) ↓ ↓ ↓ coroutine coroutine coroutine三、和第三篇的本质区别第三篇单线程一个 Reactor 多协程 特点✔ 无锁❌ 只能用一个 CPU第四篇本篇多 Reactor多线程 每个 Reactor 内部用协程 特点✔ 多核利用✔ 无锁连接不跨线程✔ 高并发四、核心设计原则非常重要原则 1连接只属于一个 Reactorfd → 固定 Reactor 不跨线程 → 不需要锁原则 2每个线程独立事件循环线程1 → epoll1线程2 → epoll2原则 3协程只在所属 Reactor 线程执行 不跨线程恢复原则 4Main Reactor 只做 accept 不处理业务五、项目结构最终版. ├── Task.h ├── Reactor.h / Reactor.cpp ├── ReactorThread.h / ReactorThread.cpp ├── ReactorThreadPool.h / ReactorThreadPool.cpp ├── SocketUtil.h / SocketUtil.cpp ├── Server.h / Server.cpp └── main.cpp六、核心代码实现1️⃣ ReactorThread线程 ReactorReactorThread.h#ifndef REACTOR_THREAD_H #define REACTOR_THREAD_H #include Reactor.h #include thread #include memory class ReactorThread { public: ReactorThread(); ~ReactorThread(); Reactor* getReactor(); void start(); private: std::unique_ptrReactor reactor_; std::thread thread_; }; #endifReactorThread.cpp#include ReactorThread.h ReactorThread::ReactorThread() { reactor_ std::make_uniqueReactor(); } ReactorThread::~ReactorThread() { if (thread_.joinable()) { thread_.join(); } } Reactor* ReactorThread::getReactor() { return reactor_.get(); } void ReactorThread::start() { thread_ std::thread([this]() { reactor_-loop(); }); }2️⃣ ReactorThreadPoolReactorThreadPool.h#ifndef REACTOR_THREAD_POOL_H #define REACTOR_THREAD_POOL_H #include ReactorThread.h #include vector #include memory class ReactorThreadPool { public: explicit ReactorThreadPool(int size); void start(); Reactor* getNextReactor(); private: std::vectorstd::unique_ptrReactorThread threads_; int index_; }; #endifReactorThreadPool.cpp#include ReactorThreadPool.h ReactorThreadPool::ReactorThreadPool(int size) : index_(0) { for (int i 0; i size; i) { threads_.emplace_back(std::make_uniqueReactorThread()); } } void ReactorThreadPool::start() { for (auto t : threads_) { t-start(); } } Reactor* ReactorThreadPool::getNextReactor() { Reactor* reactor threads_[index_]-getReactor(); index_ (index_ 1) % threads_.size(); return reactor; }3️⃣ Server协程版本Server.h#ifndef SERVER_H #define SERVER_H #include Task.h class Reactor; DetachedTask handleConnection(int fd, Reactor reactor); #endifServer.cpp#include Server.h #include Reactor.h #include unistd.h #include errno.h #include iostream #include string DetachedTask handleConnection(int fd, Reactor reactor) { std::string writeBuffer; char buffer[1024]; while (true) { co_await reactor.readable(fd); while (true) { ssize_t n read(fd, buffer, sizeof(buffer)); if (n 0) { writeBuffer.append(buffer, n); } else if (n 0) { reactor.removeFd(fd); close(fd); co_return; } else { if (errno EAGAIN) break; reactor.removeFd(fd); close(fd); co_return; } } while (!writeBuffer.empty()) { co_await reactor.writable(fd); ssize_t wn write(fd, writeBuffer.data(), writeBuffer.size()); if (wn 0) { writeBuffer.erase(0, wn); } else if (errno ! EAGAIN) { reactor.removeFd(fd); close(fd); co_return; } } } }4️⃣ 主线程 accept 分发main.cpp#include Reactor.h #include ReactorThreadPool.h #include SocketUtil.h #include Server.h #include sys/socket.h #include iostream int main() { int listenFd createListenFd(8080); ReactorThreadPool pool(4); pool.start(); Reactor mainReactor; std::cout server running :8080 std::endl; while (true) { int clientFd accept4(listenFd, nullptr, nullptr, SOCK_NONBLOCK); if (clientFd 0) { Reactor* subReactor pool.getNextReactor(); handleConnection(clientFd, *subReactor); } } return 0; }七、最核心执行流程必须理解客户端连接 ↓ Main Reactor accept ↓ 选择 Sub Reactor ↓ 启动协程 handleConnection ↓ co_await readable → 挂起 ↓ epoll_wait ↓ fd ready ↓ Reactor 恢复协程 ↓ 继续执行 read/write八、这一篇真正的价值你现在掌握的是epoll事件 Reactor调度 多线程并发 协程执行 组合起来就是现代高并发服务端模型九、总结如果说前三篇是在分别建立结构、并发和执行模型那么本篇完成的是这三者的真正融合。在这个模型中多 Reactor 提供并发能力Reactor 提供事件调度能力协程提供执行模型三者结合构成了现代高性能服务端的核心运行方式。十、下一篇第五篇 《Connection 协程面向对象的异步模型》Connection 协程工程级写法你会把Connection coroutine彻底融合成class Connection { coroutine run(); };单 Reactor 协程是“执行模型”多 Reactor 协程才是“架构模型”

相关文章:

C++ 服务端进阶(四)—— 多 Reactor + 协程:真正的高并发模型(融合版)

一、这一篇到底在做什么?到目前为止,你已经分别完成了:✔ 第一篇:Connection(结构抽象)✔ 第二篇:多 Reactor(并发模型)✔ 第三篇:单 Reactor 协程&#xff…...

JAVA无人共享自习室预约小程序源码代码

以下是为您整理的基于UniApp的Java无人共享自习室预约小程序源码实现方案,包含核心模块代码与实现逻辑:后端Java核心模块(SpringBoot)数据库设计(MySQL)Entity Table(name "study_room") public…...

保姆级教程:用Vue 3 + Cesium 1.107 加载倾斜摄影模型(从OSGB到3DTiles全流程)

从OSGB到Web三维:Vue 3与Cesium 1.107的倾斜摄影实战指南 当我们需要在网页中展示真实世界的三维场景时,倾斜摄影技术提供了绝佳的解决方案。这种通过航拍获取多角度影像并重建三维模型的技术,已经成为数字孪生、智慧城市等领域的标配。但将专…...

Qwen3.5-35B-AWQ-4bit效果展示:建筑设计草图→功能分区→材料标注→预算估算联动

Qwen3.5-35B-AWQ-4bit效果展示:建筑设计草图→功能分区→材料标注→预算估算联动 1. 模型能力概览 Qwen3.5-35B-AWQ-4bit是一款专为视觉多模态理解设计的量化模型,在建筑设计领域展现出惊人的实用价值。这个模型能够: 准确识别建筑草图中的…...

Qwen-Image-2512-Pixel-Art-LoRA 持续集成:使用GitHub Actions自动化测试模型部署更新

Qwen-Image-2512-Pixel-Art-LoRA 持续集成:使用GitHub Actions自动化测试模型部署更新 最近在折腾一个像素艺术风格的AI图像生成项目,核心是那个Qwen-Image-2512-Pixel-Art-LoRA模型。每次更新模型权重或者调整一下推理服务的配置,都得手动重…...

无需前端开发!Clawdbot配置Qwen3-32B,快速拥有Web聊天界面

无需前端开发!Clawdbot配置Qwen3-32B,快速拥有Web聊天界面 1. 为什么选择Clawdbot整合Qwen3-32B? 你是否遇到过这样的困境:团队内部部署了强大的Qwen3-32B大模型,却因为缺乏友好的交互界面而难以推广使用&#xff1f…...

OpenClaw技能市场探秘:Gemma-3-12b-it生态的优质工具推荐

OpenClaw技能市场探秘:Gemma-3-12b-it生态的优质工具推荐 1. 为什么需要关注OpenClaw技能市场? 上周我在整理团队周报时,突然意识到一个问题:我们花在重复性操作上的时间太多了。从数据整理到图表生成,再到内容发布&…...

文脉定序完整指南:从模型下载、镜像构建、服务启动到监控告警全流程

文脉定序完整指南:从模型下载、镜像构建、服务启动到监控告警全流程 如果你正在构建一个智能问答系统或知识库,一定遇到过这样的烦恼:系统能搜出一堆看似相关的文档,但最精准、最贴切的答案往往不在最前面。用户需要手动翻找&…...

番茄小说下载器:高效资源获取与格式处理的创新解决方案

番茄小说下载器:高效资源获取与格式处理的创新解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 番茄小说下载器作为一款基于Rust构建的开源工具&#xff0c…...

麒麟kylinV10系统yum源优化与rpm包管理实战

1. 麒麟kylinV10系统yum源优化实战 第一次用麒麟kylinV10系统时,最让我头疼的就是默认yum源速度慢得像蜗牛。记得有次安装个基础开发工具,等了半小时进度条才动了一点点。后来发现通过优化yum源配置,下载速度能提升10倍不止。下面就把我这几年…...

终极罗技鼠标宏压枪指南:告别PUBG后坐力困扰的3个秘诀

终极罗技鼠标宏压枪指南:告别PUBG后坐力困扰的3个秘诀 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中的武器后坐力…...

学术公式迁移困境:从3小时到45秒的转换革命——LaTeX2Word-Equation技术解析

学术公式迁移困境:从3小时到45秒的转换革命——LaTeX2Word-Equation技术解析 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 问题溯源…...

WarcraftHelper:经典游戏现代重生的兼容性解决方案

WarcraftHelper:经典游戏现代重生的兼容性解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 让魔兽争霸III完美适配Windows 10/11系…...

标题诊断报告如何与其他 SEO 数据结合分析

标题诊断报告在SEO中的重要性 在当今的数字营销世界中,标题诊断报告是每一个SEO优化者都必须了解和运用的工具。标题不仅是吸引用户点击的关键因素,也是搜索引擎评估页面相关性的重要元素。掌握如何有效利用标题诊断报告,可以帮助你提高网站…...

如何判断seo 报价是否合适

如何判断SEO报价是否合适 在当前数字化营销的环境中,SEO(搜索引擎优化)已经成为企业提升在线可见性和吸引潜在客户的关键策略。SEO服务的报价各异,不少企业在选择服务时往往会纠结于如何判断一个SEO报价是否合适。本文将从多个角…...

初学者如何自学SEO优化

初学者如何自学SEO优化 在当今互联网时代,搜索引擎优化(SEO)已经成为了网站推广的核心手段。对于初学者来说,如何自学SEO优化可能看起来有些复杂,但只要掌握几个关键点,就能迅速上手。本文将带你深入了解如…...

Intv_ai_mk11 流程图生成与解析:集成Visio实现架构设计智能辅助

Intv_ai_mk11 流程图生成与解析:集成Visio实现架构设计智能辅助 1. 场景痛点:传统架构设计的效率瓶颈 在系统架构设计和业务流程规划中,流程图是最常用的可视化工具之一。传统的工作流程通常是这样的:架构师先在脑海中构思设计&…...

快速搭建阿里Qwen3-4B-Instruct-2507:部署步骤详解与问题排查

快速搭建阿里Qwen3-4B-Instruct-2507:部署步骤详解与问题排查 1. 模型简介与核心能力 1.1 Qwen3-4B-Instruct-2507概述 Qwen3-4B-Instruct-2507是阿里巴巴通义实验室最新推出的轻量级开源大语言模型,作为Qwen系列的重要成员,它在保持40亿参…...

Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取

Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取 语音识别技术正在快速融入我们的日常生活,从智能助手到实时字幕,都离不开高效的语音转文本能力。Qwen3-ASR-0.6B作为一款轻量级语音识别模型,在保证识别准确率的同时,更…...

Phi-3-Mini-128K多模型协作实践:与Claude Code协同完成复杂编程任务

Phi-3-Mini-128K多模型协作实践:与Claude Code协同完成复杂编程任务 1. 引言 你有没有遇到过这样的情况?面对一个稍微复杂的编程任务,比如要搭建一个带用户管理的小型Web应用,你让一个AI助手来帮忙。它可能很快给你生成了一段登…...

罗技PUBG鼠标宏压枪脚本技术解析:后坐力控制算法实现与架构设计

罗技PUBG鼠标宏压枪脚本技术解析:后坐力控制算法实现与架构设计 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在FPS游戏《绝地求生…...

手把手教你用Postman调试DolphinScheduler 3.x创建任务API(附数据库查Code指南)

手把手教你用Postman调试DolphinScheduler 3.x创建任务API(附数据库查Code指南) 在分布式任务调度系统的日常运维中,API调试是开发者和运维人员必须掌握的硬核技能。DolphinScheduler作为一款开源的分布式易扩展可视化工作流任务调度平台&…...

Pixel Script Temple多场景落地:政务宣传短视频、乡村振兴纪录片脚本生成

Pixel Script Temple多场景落地:政务宣传短视频、乡村振兴纪录片脚本生成 1. 专业剧本创作工具介绍 Pixel Script Temple(像素剧本圣殿)是一款基于Qwen2.5-14B-Instruct大模型深度优化的专业剧本创作工具。它将先进的AI推理能力与独特的8-B…...

AI 模型推理容器化实践方案

AI模型推理容器化实践方案:高效部署与弹性扩展 随着AI技术的快速发展,模型推理的部署效率与资源管理成为企业关注的核心问题。容器化技术凭借其轻量化、可移植性和弹性扩展能力,成为AI模型推理部署的理想选择。本文将介绍AI模型推理容器化的…...

Mamba实战:如何用选择性状态空间模型提升你的长序列处理效率(附代码)

Mamba实战:如何用选择性状态空间模型提升你的长序列处理效率(附代码) 在自然语言处理、基因组学和金融时间序列分析等领域,处理长序列数据一直是个棘手的问题。传统Transformer架构虽然强大,但随着序列长度增加&#x…...

3分钟上手的跨平台模组管理神器:Lumafly核心优势解析

3分钟上手的跨平台模组管理神器:Lumafly核心优势解析 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 还在为空洞骑士模组安装时的依赖缺失而头疼&am…...

使用MobaXterm高效管理远程PyTorch训练:图形化SFTP与中文设置

使用MobaXterm高效管理远程PyTorch训练:图形化SFTP与中文设置 1. 为什么选择MobaXterm进行AI开发 在深度学习项目开发中,我们经常需要在远程服务器上运行PyTorch训练任务。传统的SSH工具虽然能完成基本操作,但在文件传输、可视化管理和多任…...

雷达导论PART I.2 核心原理与信号处理 2024-1-18

1. 雷达信号处理的核心原理 雷达系统通过发射电磁波并接收目标反射的回波信号来探测目标信息。这个看似简单的过程背后,其实蕴含着丰富的物理原理和精妙的信号处理技术。我们先从最基础的多普勒效应说起。 多普勒效应是雷达测速的核心原理。当目标与雷达之间存在相对…...

深入探索neofetch:自定义Linux系统信息与ASCII艺术Logo的进阶技巧

1. 认识neofetch:终端里的系统名片 第一次在终端里输入neofetch命令时,我被这个酷炫的小工具惊艳到了——它不仅清晰地列出了我的Linux系统信息,还在左侧展示了一个精致的ASCII艺术Logo。作为Linux用户,我们每天都要和终端打交道&…...

python pygame实现贪食蛇

文章目录步骤2、创建snake.py,然后运行即可操作方式解读很简单的一个例子,开启小游戏制作大门。步骤 1、安装依赖 pip install pygame2、创建snake.py,然后运行即可 代码: import pygame import time import random# --- 1. 初…...