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/10/18 3:25:58 阅读更多 →
大模型接入调查岗位匹配度

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

计算岗位匹配度 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/10/18 3:27:41 阅读更多 →
Python 解析“长得像 list 的 Document 字符串“:

Python 解析“长得像 list 的 Document 字符串“:

Python 解析"长得像 list 的 Document 字符串":提取 page 并拼接(别再无脑 eval)这是字符串转 list 系列的第 2 题。第 1 题里字符串是标准的 JSON / Python 列表,用 json.loads / ast.literal_eval 就能解决。但这一题…

2026/10/17 16:14:00 阅读更多 →

最新新闻

高光谱图像处理工具包:PCA降维+KNN/CNN分类全流程实战

高光谱图像处理工具包:PCA降维+KNN/CNN分类全流程实战

简介:一套面向高光谱图像处理的 MATLAB 工具包,整合了主成分分析、K近邻分类与卷积神经网络三类主流算法,适用于遥感、环境保护、地质勘探、农业监测等领域的科研人员与工程师,用于解决高光谱数据维度高、信息冗余、传统分类方法难…

2026/10/18 9:49:35 阅读更多 →
智能体交互实战:从工具调用协议到上下文状态管理

智能体交互实战:从工具调用协议到上下文状态管理

你有没有遇到过这种情况:跟一个智能体聊着聊着,它突然忘了自己十分钟前说过的话,或者更离谱——它明明可以调用工具,却一本正经地编造了一个并不存在的天气数据给你。我最早做智能体交互项目时,以为这东西无非就是把大…

2026/10/18 9:49:35 阅读更多 →
告别 Copilot?Codex 本地化部署指南:从环境搭建到私有化实践

告别 Copilot?Codex 本地化部署指南:从环境搭建到私有化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 9:49:35 阅读更多 →
一行命令解锁 Claude Code 全部功能:用 TaoToken 统一 Key 打通 AI 编程链路

一行命令解锁 Claude Code 全部功能:用 TaoToken 统一 Key 打通 AI 编程链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 9:49:35 阅读更多 →
华三三层端口聚合:静态与动态聚合原理及故障排查

华三三层端口聚合:静态与动态聚合原理及故障排查

简介:本资源是一份面向网络工程师、运维人员及备考H3C认证的技术人员的实操型配置指南,聚焦华三交换机三层端口聚合的核心场景——静态与动态两种模式的完整部署方案。内容覆盖聚合口创建、三层路由模式启用、物理端口加入、动态协商配置及关键验证命令&…

2026/10/18 9:49:35 阅读更多 →
MiniCPM-o-4.5全模态模型在OpenVINO上的边缘部署实践

MiniCPM-o-4.5全模态模型在OpenVINO上的边缘部署实践

1. 为什么把 MiniCPM-o-4.5 托付给 OpenVINO先交代一下背景。去年底我们接了一个离线设备端的智能问答需求,要求一台不带独立显卡的工控机完成文本问答、图像理解、音频转写三类任务。选型比来比去,最终敲定了 MiniCPM-o-4.5 这个全模态模型,…

2026/10/18 9:48:35 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →