Muduo - Reactor模式

article/2025/11/6 17:10:56

Muduo - Reactor模式

一、Reactor 是什么

wiki的中文定义:Reactor模式是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handler,这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。


从上述文字中我们可以看出以下关键点:

  1. 事件驱动(event handling)
  2. 可以处理一个或多个输入源(one or more inputs)
  3. 通过Service Handler同步的将输入事件(Event)采用多路复用分发给相应的Request Handler(多个)处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqMXsBTi-1590139303282)在这里插入图片描述(C:\Users\andyhkmo\Pictures\Saved Pictures\pic3.png)]

二、单线程Reactor模式

单Reactor单线程模式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uC8us57g-1590139303285)(C:\Users\andyhkmo\Pictures\Saved Pictures\pic4.png)]在这里插入图片描述

简单代码如下

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
server_socket.bind(('', 2007))  
server_socket.listen(5)  
# serversocket.setblocking(0)  poll = select.poll() # epoll() should work the same  
connections = {}  
handlers = {}  def handle_input(socket, data):  socket.send(data) # sendall() partial?  def handle_request(fileno, event):  if event & select.POLLIN:  client_socket = connections[fileno]  data = client_socket.recv(4096)  if data:  handle_input(client_socket, data)  else:  poll.unregister(fileno)  client_socket.close()  del connections[fileno]  del handlers[fileno]  def handle_accept(fileno, event):  (client_socket, client_address) = server_socket.accept()  print "got connection from", client_address  # client_socket.setblocking(0)  poll.register(client_socket.fileno(), select.POLLIN)  connections[client_socket.fileno()] = client_socket  handlers[client_socket.fileno()] = handle_request  poll.register(server_socket.fileno(), select.POLLIN)  
handlers[server_socket.fileno()] = handle_accept  while True:  events = poll.poll(10000) # 10 seconds  for fileno, event in events:  handler = handlers[fileno]  handler(fileno, event)  

最基本的单线程Reactor模型,程序的核心是事件循环,通过handlers转发到各个函数中去。

三、muduo Reactor模式

muduo是基于非阻塞的IO和事件驱动的网络库。

muduo的整体结构是one loop per thread+threadpool。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZqaGYcF-1590139303286)(C:\Users\andyhkmo\Pictures\Saved Pictures\pic9.png)]在这里插入图片描述


muduo的事件驱动都是通过一个EventLoop来完成的。EventLoop一直处在事件循环中,通过IO复用机制poll/epoll回调激活的事件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-39RZJVEe-1590139303288)(C:\Users\andyhkmo\Pictures\Saved Pictures\pic5.png)]在这里插入图片描述

而muduo的Reactor主要由三部分组成,EventLoop、Poller、Channel。


  1. EventLoop即IO线程中的事件循环.它能确保所有注册的事件都在EventLoop对象所在的线程中执行,不用考虑事件的并发。它是线程安全的,且允许其他线程往EventLoop里面塞东西。

  2. Poller 是IO multiplexing的封装,它是EventLoop的组成,与EventLoop的生命期相当,为EventLoop提供poll()方法。

  3. Channel 每个Channel对象自始至终只负责一个文件描述符(fd)IO事件分发,但它不拥有这个fd,也不会在析构的时候关闭这个fd。每个Channel对象自始至终只属于一个EventLoop,因此每个Channel对象都只属于某一个IO线程。 Channel会把不同的IO事件分发为不同的回调, 例如ReadCallbackWriteCallback等。

EventLoop的时序图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTmuUSrj-1590139303291)(C:\Users\andyhkmo\Pictures\Saved Pictures\pic6.png)]在这里插入图片描述

具体实现代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VW0kROkN-1590139303292)(C:\Users\andyhkmo\AppData\Roaming\Typora\typora-user-images\1590033396599.png)]在这里插入图片描述


由于muduo整体架构one loop per thread + threadpool的架构,也可以说是一个主EventLoop和EventLoopPool的方式。

主EventLoop管理Acceptor,主要是listen和accept新的连接,然后由EventLoopPool去处理新Channel的读写事件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2s5ypFkL-1590139303293)(C:\Users\andyhkmo\Pictures\Saved Pictures\pic8.png)]在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mojSBfzK-1590139303294)(C:\Users\andyhkmo\AppData\Roaming\Typora\typora-user-images\1590040905144.png)]在这里插入图片描述


待续:muduo中的线程安全日志的实现,异步日志。


http://chatgpt.dhexx.cn/article/yKXv7vIi.shtml

相关文章

muduo网络库——ThreadPool

模型 源码分析 1&#xff09;接口 class ThreadPool : noncopyable {public:typedef std::function<void ()> Task;explicit ThreadPool(const string& nameArg string("ThreadPool"));~ThreadPool();void setMaxQueueSize(int maxSize) { maxQueueSize…

muduo网络库——Channel

模型 实现流程&#xff1a; 前面已经介绍了EPoller类&#xff0c;EPoller主要监听的是Channel对象&#xff0c;每一个Channel对象会绑定一个文件描述符&#xff08;fd_&#xff09;&#xff0c;fd_上绑定要监听的事件。当epoll监听到就绪事件时&#xff0c;会将就绪事件添加到…

muduo源码分析之Buffer

这一次我们来分析下muduo中Buffer的作用&#xff0c;我们知道&#xff0c;当我们客户端向服务器发送数据时候&#xff0c;服务器就会读取我们发送的数据&#xff0c;然后进行一系列处理&#xff0c;然后再发送到其他地方&#xff0c;在这里我们想象一下最简单的EchoServer服务器…

从实例看muduo网络库各模块交互过程

文章目录 muduo网络库的核心代码模块各模块功能解释ChannelPollerEpollPoller EventLoopEventLoopThreadEventLoopThreadPoolTcpServerTcpConnection 从实际应用出发 muduo网络库的核心代码模块 1、channel 2、Poller 和它的子类 EpollPoller 3、EventLoop 4、Thread、EventLo…

muduo总结

本文重点在muduo TcpServer的启动&#xff0c;I/O线程池的启动&#xff0c;以及各种回调 文章目录 baseAsyncLogging.{h,cc}Atomic.hBlockinQueue.hBoundedBlockinQueue.hCondition.hcopyable.hCountDownLatch.{h,cc}Date.{h,cc}Exception.{h,cc}Logging.{h,cc}Mutex.hProcess…

muduo网络库——日志处理

测试程序 #include "muduo/base/AsyncLogging.h" #include "muduo/base/Logging.h" #include "muduo/base/Timestamp.h"#include <stdio.h> #include <sys/resource.h> #include <unistd.h>off_t kRollSize 500*1000*1000;m…

Muduo日志模块详解

Muduo日志模块解析 图片取自muduo网络库源码解析(1):多线程异步日志库(上)_李兆龙的技术博客_51CTO博客也是很好的日志讲解博客,这篇讲解流程基本上和它差不多,并且写的比我条理清楚很多 AppendFile::append() 这个函数是日志写入文件的最终函数,并且AppendFile这个类里面也是…

Muduo 定时器

TimeQueue定时器 图片转载自:muduo网络库源码解析(4):TimerQueue定时机制_李兆龙的技术博客_51CTO博客 添加新的定时器 TimerId TimerQueue::addTimer(TimerCallback cb, //用户自定义回调Timestamp when, //定时器的超时时刻double interval) //重复触发间隔,小于0则不重…

《muduo网络库》学习笔记——muduo学习总结

muduo是基于非阻塞的IO和事件驱动的网络库&#xff08;Reactor模式&#xff09;&#xff0c;其核心是一个事件循环EventLoop&#xff0c;用于响应计时器和IO事件。muduo采用基于对象&#xff08;object-based&#xff09;而非面向对象&#xff08;object-oriented&#xff09;的…

Ubuntu安装muduo库

1. 首先安装boost库&#xff1b; sudo apt-get update sudo apt-get install libboost-all-dev 2. 下载muduo库&#xff0c; https://github.com/chenshuo/muduo 3. 解压后进入解压目录&#xff0c;vim CMakeLists.txt&#xff0c;注释掉略过unit_test测试用例代码的编译&#…

linux muduo 编译安装,muduo记录

1.muduo编译安装 编译muduo遇见的报错可以在github上的issue上面查找。一般都能顺利解决,我遇到的就是没有安装boost-dev. centos7系统 执行: sudo yum install boost-dev 2.截取流程图 图片截取自《Linux多线程服务端编程&#xff1a;使用muduo C网络库》 3.源码摘录 摘录一个…

muduo源码分析之TcpServer模块

这次我们开始muduo源代码的实际编写&#xff0c;首先我们知道muduo是LT模式&#xff0c;Reactor模式&#xff0c;下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有一个主反应堆mainReactor以及几个子反应堆subReactor&#xff0c;其中子反应…

muduo网络库学习(1)

muduo网络库学习&#xff08;1&#xff09; 文章目录 muduo网络库学习&#xff08;1&#xff09;前言一、muduo是什么&#xff1f;二、代码结构1.base库2.net库3.附属库 二、网络库结构总结 前言 本章节主要介绍muduo网络库的整体架构&#xff01;一、muduo是什么&#xff1f;…

muduo

muduo 概述 muduo是基于Reactor模式的网络库&#xff0c;用于响应计时器和IO事件。 muduo采用基于对象而非面向对象的设计风格&#xff0c;其事件回调采用functionbind&#xff0c;用户在使用muduo的时候不需要继承其中的class 架构 Multiple Reactor Reactor模式&#xff1a…

muduo日志库原理以及源码分析

muduo日志库特点 日志批量写入批量唤醒写线程写日志用notifywait_timeout 方式触发日志的写入锁的粒度&#xff0c;双缓冲&#xff0c;双队列buffer默认 4M 缓冲区&#xff0c; buffers 是 buffer 队列&#xff0c; push 、 pop 时使用 move 语义 减少内存拷贝 muduo的这些特点…

muduo网络库与服务模型介绍

目录 一、muduo网络库简介 1、特点 2、代码结构 &#xff08;1&#xff09;公共接口 &#xff08;2&#xff09;内部实现 二、muduo线程模型 1、单线程Reactor 2、Reactor线程池 3、one loop per thread 4、one loop per thread 线程池 muduo是陈硕个人使用C开发的一…

muduo 架构解析

muduo是一个基于Reactor模式的C网络库。它采用非阻塞I/O模型&#xff0c;基于事件驱动和回调。我们不仅可以通过muduo来学习linux服务端多线程编程&#xff0c;还可以通过它来学习C11。     Reactor是网络编程的一般范式。我们这里从reactor模式为出发点&#xff0c;根据R…

muduo库介绍

muduo库是一个多线程服务器开发库 muduo 作者陈硕&#xff0c;现在在美国加州硅谷某互联网大公司工作&#xff0c;从事大规模分布式的可靠系统工程。这个库是作者多年工作的总结&#xff0c;可以说大家学通了这个库&#xff0c;找一份Linux服务器开发的工作是没问题的&#xf…

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C network library based on the reactor pattern. muduo库的介绍就是&#xff1a;一个基于reactor反应堆模型的多线程C网络库。 muduo网络库是C语言开发的一个非常优秀的网络库&#xff0c;作者陈硕&#xff0c;muduo网络库在多线程环境下性能非常高…

遗传算法示例

遗传的概念&#xff1a; 遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型&#xff0c;是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法的特点&#xff1a; 对于搜索算法的共同特征有 首先组成一组候选解。依据某些使用性条件测算这些…