Reactor模型 + muduo网络库日志打印
一个好的服务器的设计一个良好的服务器应该怎么设计在之后的文章里面我不仅仅会写网络库也会解析sylar服务器框架所以一个良好的服务器设计很重要。我们现在都是多核的计算机所以多线程服务的问题就转化成了如何设计一个高效且易于使用的eventLoop然后每一个线程run一个eventLoop就可以了。eventLoop是non-blocking网络编程的核心而且non-blocking一般都和IO多路复用一起连用。原因有几个没有人会一直轮询某个non-blocking的IO这样子很费CPU如果我们选择阻塞像read/write/connect/accept 都有可能意外的阻塞当前的线程导致当前线程就没有办法在socket处理其他的事情了。Reactor我们在书写网络库的时候一定要好好的理解Reactor模型Reactor模型里面有4个部分event事件reactor反应堆demultiplex事件分发器eventhandler事件处理器。当有事件event和handler注册时就会进入reactorreactor里面维护了所有的event集合reactor会通过epoll_ctl()来注册发生的事件在事件分发器里面调整event并且启动反应堆开启epoll_wait如果epoll_wait监听到有事件产生事件分发器就会返回event给reactor。为什么要返回呢因为事件的发生就意味着需要执行回调函数那么我们的回调函数全部都在反应堆里面。所以reactor就像一个大脑可以开启监听epoll_wait也就是事件分发器也会调用回调函数也就是EventHandler这个就是muduo库的reactor的模型不过这里有一点点的不一样这里的reactor吧reactor和demultiplex合二为一了我们可以简单的陈述一下子这个过程。当服务器开启之后会创建一个mainLoop这个mainLoop就是监听所有客户端的接口。因为现在的计算机都是多核多个CPU所以我们肯定不会是单线程运行每个线程都会对应一个CPU。当客户端发来信息我们计算机后端需要进行接受read解码decode编码encode最后发送给客户端。mainLoop里面有一个acceptor这个有两个部分的功能一个是listen监听一个是分发给subLoop子reactor这样子就可以有多个线程进行工作了。日志打印日志的打印是一个项目必备的部分当项目发生错误的时候我们可以快速的定位。我们打印器是一个单例模式然后每当使用打印器的时候定义其打印水平一遍打印出不同的东西。enum LogLevel { INFO, ERROR, FATAL, DEBUG, }; class Logger { public: static Logger* getInstance(); void setLogLevel(int level); void log(std::string msg); private: Logger(){} Logger(const Logger) delete; void operator(const Logger) delete; private: int m_logLevel; };#include ../include/Logger.h Litguidyo::Logger* Litguidyo::Logger::getInstance() { static Logger logger; return logger; } void Litguidyo::Logger::setLogLevel(int level) { m_logLevel level; } void Litguidyo::Logger::log(std::string msg) { switch (m_logLevel) { case INFO: std::cout [INFO]; break; case ERROR: std::cout [ERROR]; break; case FATAL: std::cout [FATAL]; break; case DEBUG: std::cout [DEBUG]; break; default: break; } // 打印时间 std::cout print time : msg std::endl; }为了更加方便使用打印日志我们一般都会定义很多宏。打印日志很多时候都是do while的结构防止出现一些语句的匹配错误debug我们一般都会在配置的时候确定是否开启所以要加ifdef DEBUG在出现致命错误的时候整个程序都必须要停止所以会有exit-1#define LOG_INFO(logmsgFormat, ...) \ do { \ Logger* logger Logger::getInstance(); \ logger-setLogLevel(INFO); \ char buf[1024] {0}; \ snprintf(buf, sizeof(buf), logmsgFormat, ##__VA_ARGS__); \ logger-log(buf); \ } while(0) #define LOG_ERROR(logmsgFormat, ...) \ do { \ Logger* logger Logger::getInstance(); \ logger-setLogLevel(ERROR); \ char buf[1024] {0}; \ snprintf(buf, sizeof(buf), logmsgFormat, ##__VA_ARGS__); \ logger-log(buf); \ } while(0) #ifdef MUDBUG #define LOG_DEBUG(logmsgFormat, ...) \ do { \ Logger* logger Logger::getInstance(); \ logger-setLogLevel(DEBUG); \ char buf[1024] {0}; \ snprintf(buf, sizeof(buf), logmsgFormat, ##__VA_ARGS__); \ logger-log(buf); \ } while(0) #else #define LOG_DEBUG(logmsgFormat, ...) #endif #define LOG_FATAL(logmsgFormat, ...) \ do { \ Logger* logger Logger::getInstance(); \ logger-setLogLevel(FATAL); \ char buf[1024] {0}; \ snprintf(buf, sizeof(buf), logmsgFormat, ##__VA_ARGS__); \ logger-log(buf); \ exit(-1); \ } while(0) }总结本篇文章到这里就结束了希望可以帮助大家理解~~~

相关新闻

Redisson分布式锁与集合实战指南

Redisson分布式锁与集合实战指南

1. Redisson 实战概述作为一款基于Redis的Java客户端,Redisson在分布式系统开发中扮演着重要角色。我在实际项目中使用Redisson已有三年多时间,从最初的简单分布式锁应用到如今的全套分布式对象服务,深刻体会到它为Java开发者带来的便利。与传…

2026/8/11 3:34:25 阅读更多 →
大模型接入调查岗位匹配度

大模型接入调查岗位匹配度

计算岗位匹配度 job_router.get(“/resume_submission_detail/{id}”, summary“简历投递详情”) async def resume_submission_detail(id:int): resawait JobService.resume_submission_detail(id) return { “code”: 1, “message”: “查询成功”, “data”: json.loads(re…

2026/8/11 3:34:25 阅读更多 →
Matlab实现综合能源系统碳交易与需求响应优化

Matlab实现综合能源系统碳交易与需求响应优化

1. 项目背景与核心价值在能源结构转型的大背景下,综合能源系统(Integrated Energy System, IES)的优化运行成为学术界和工业界共同关注的焦点。这个Matlab项目将碳交易机制与需求响应策略相结合,为多能互补系统的经济运行提供了创…

2026/8/11 3:34:25 阅读更多 →

最新新闻

5分钟免费iOS激活锁绕过指南:Applera1n解锁iPhone 6s-X完整方案

5分钟免费iOS激活锁绕过指南:Applera1n解锁iPhone 6s-X完整方案

5分钟免费iOS激活锁绕过指南:Applera1n解锁iPhone 6s-X完整方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n Applera1n是一款专为iOS 15-16系统设计的免费激活锁绕过工具,专…

2026/8/11 4:21:50 阅读更多 →
【金仓数据库征文】AI Agent SQL 执行超时与资源保护——在线问数不能把数据库当成“无限工具”

【金仓数据库征文】AI Agent SQL 执行超时与资源保护——在线问数不能把数据库当成“无限工具”

文章目录每日一句正能量1. 背景与问题:SQL 是只读的,也可能把生产库拖慢2. 环境与数据:先定义服务预算,再讨论参数2.1 为什么不能直接照抄一个 30 秒超时3. 复现过程:为什么只设 statement_timeout 仍然会出问题3.1 第…

2026/8/11 4:21:50 阅读更多 →
洛谷P1219、P1784、P11229三题的题解

洛谷P1219、P1784、P11229三题的题解

因为八个皇后位置之间相互制约&#xff0c;所以肯定得记录每个皇后的位置。 我们可以枚举每一个格子的位置&#xff0c;再看它的列、对角线是否与其他皇后相等。&#xff08;dfs传进的参数为行号&#xff0c;不会相重&#xff09; #include <bits/stdc.h> using namespac…

2026/8/11 4:21:50 阅读更多 →
Agent 安全事件成为本周核心风险信号,从三起越界评测到 Hugging Face 入侵

Agent 安全事件成为本周核心风险信号,从三起越界评测到 Hugging Face 入侵

文章目录先把事实说准&#xff1a;两组事件不是同一种“失控”Anthropic 三起事件&#xff1a;一句错误的环境假设如何变成真实入侵事件一&#xff1a;虚构公司撞名真实公司事件二&#xff1a;为了完成依赖混淆&#xff0c;真的把恶意包发到了 PyPI事件三&#xff1a;约 9,000 …

2026/8/11 4:21:50 阅读更多 →
如何在5分钟内用YOLOv8 AI自瞄助手打造你的FPS游戏智能瞄准系统

如何在5分钟内用YOLOv8 AI自瞄助手打造你的FPS游戏智能瞄准系统

如何在5分钟内用YOLOv8 AI自瞄助手打造你的FPS游戏智能瞄准系统 【免费下载链接】yolov8_aimbot Aim-bot based on AI for all FPS games 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_aimbot 还在为FPS游戏中的瞄准难题而烦恼吗&#xff1f;想要在激烈的枪战中…

2026/8/11 4:21:50 阅读更多 →
3个实用技巧:掌握FanControl风扇控制软件的高级配置

3个实用技巧:掌握FanControl风扇控制软件的高级配置

3个实用技巧&#xff1a;掌握FanControl风扇控制软件的高级配置 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…

2026/8/11 4:20:49 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升&#xff1a;AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析&#xff1a;控制台与Apifox的数据差异 最近在调试一个前后端分离项目时&#xff0c;遇到了一个典型问题&#xff1a;后端服务在本地开发环境控制台能正常输出查询数据&#xff0c;但通过Apifox测试时却返回空结果。这种"控制台有数据&#xff0c;接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友&#xff0c;尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友&#xff0c;都在问我同一个问题&#xff1a;“听说现在用Claude Code这种AI编程工具&#xff0c;小白也能做游戏了&#xff0c;是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑&#xff1a;baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码&#xff08;维护中 rm repo&#xff09; 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片&#xff1a;Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身&#xff0c;而应重视模型外的系统搭建&#xff0c;即Harness。提出AgentModelHarness的实用公式&#xff0c;详细介绍Harness的四个层次&#xff1a;持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →