发布时间:2026/8/11 3:35:57
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) }总结本篇文章到这里就结束了希望可以帮助大家理解~~~

相关新闻

2026/8/11 3:35:57

Spring事务失效的八大场景与解决方案

1. Spring事务失效场景深度解析从事Java开发这些年,Spring事务管理就像个熟悉的陌生人——看似简单,实则暗藏玄机。最近团队里连续出现几起因事务失效导致的线上事故,让我决定系统梳理这个"老熟人"的脾气秉性。下面这些坑&#xff…

2026/8/11 3:35:57

联想记忆法在语言学习中的应用与技巧

由于提供的输入内容过于简略(项目标题为"2026.03.11四级联想 第三节",其余字段均为空),且缺乏明确的主题、技术背景或应用场景说明,无法生成符合要求的专业博文。为保障内容质量与安全性,建议补充…

2026/8/11 3:35:57

springboot单位考勤系统的管理设计与实现

课题背景 随着信息技术的快速发展,传统的人工考勤管理方式逐渐暴露出效率低、易出错、数据难以统计分析等问题。尤其在企事业单位、教育机构等场景中,考勤管理涉及大量人员数据的记录、存储和分析,传统纸质签到或简单的电子表格已无法满足现代…

2026/8/11 4:41:01

5.4.3 InnoDB ⾏锁

InnoDB 的行锁是 MySQL 实现高并发能力的核心,也是 InnoDB 能够成为默认存储引擎的重要原因。 与 MyISAM 的表级锁不同,InnoDB 的行锁粒度更细,允许多个事务同时修改同一张表的不同行,从而显著提升数据库的并发性能。 &#x1f3a…

2026/8/11 4:41:01

2026年东北推拉门供应商精选,靠谱门店这样选

2026年东北推拉门供应商精选,靠谱门店这样选一、 业务标题是什么:东北推拉门供应商选择的核心命题随着东北地区城市化进程的持续深化与消费升级,推拉门已从单一的隔断功能演变为提升居住品质、彰显空间美学的重要组成部分。对于沈阳、大连、长…

2026/8/11 4:41:01

多Agent编排核心技术全解:从模式设计到实战应用

1. 项目概述:从单兵作战到团队协作的进化如果你已经玩过一阵子AI Agent,搭建过几个能查天气、写周报的“智能体”,那你可能已经感受到了单Agent的局限性。它就像一个全能的个人助理,虽然能干,但面对一个复杂的项目——…

2026/8/11 4:41:01

《战舰世界》超级意战“沉舰者”实战解析:烟幕与SAP的战术运用

这次我们来看一个《战舰世界》游戏中的实战案例解析,聚焦于“猫叔不吃鱼”玩家操控超级意大利战列舰“沉舰者”的一场精彩对局。对于《战舰世界》的玩家,尤其是战列舰爱好者而言,理解一艘顶级金币船的实战打法、定位和优劣势,远比…

2026/8/11 4:36:01

Fusion 360模型编辑:从参数化到直接编辑,掌握创客核心技能

1. 从“下载”到“创造”:为什么创客必须掌握模型编辑如果你是一名创客,大概率经历过这样的场景:从某个开源平台下载了一个看起来很酷的3D模型,兴冲冲地导入打印机,结果发现尺寸不对、结构有误,或者某个细节…

2026/8/11 3:03:40

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

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

2026/8/10 5:09:58

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/11 0:00:39

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

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

2026/8/11 0:00:39

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

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

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/10 11:20:30

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…