《Muduo 多线程网络库解析》

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Muduo是C++语言实现的网络库,和Anet的设计目标基本一致,各有千秋。希望通过阅读Muduo能找到一些不一样的灵感。

Muduo是C++语言实现的网络库,和Anet的设计目标基本一致,各有千秋。希望通过阅读Muduo能找到一些不一样的灵感。

下面是本人最近分享muduo的ppt。性能对比图和类图是直接从muduo库的manual手册截过来的,其余的是用libreoffice上画出来。

概述:

1) muduo的抽象不错的:概括上来说EventLoop 封装了对事件的处理,这是client和server共有的逻辑,而且EventLoop和ThreadPool是解耦合的,为多线程IO模型奠定了基础;TcpServer 封装了Server端的逻辑和回调,比如acceptor。TcpClient封装了client的逻辑和回调,比如connector。

2)muduo仅仅提供了3个最基础的设施(事件处理,TimerQueue 和 functionQueue),并没有提供像anet的timeout的机制,也没有提供channelid。这些功能可以通过3个基础设在muduo的上层实现。ppt最后一页举了个处理idle链接的例子。把所有的链接组织成8个boost::circle_buffer。并处理两个事件:a)链接的建立,把conn的shared_ptr插入尾端;b)消息的到来,再一次把链接的shared_ptr再次插入尾端。同时,注册一个定时器:每一秒往boost::circle_buffer尾部插入一个trival的结构,目的是每隔一秒淘汰首部的shared_ptr;当所有的格子里的shared_ptr都淘汰之后,conn就被析构了。

3)性能体现在细节上。a)buffer的设计,muduo的buffer设计和anet如出一辙。b)read读取数据,在栈上开64k的空间,使用readv,把当前conn的inputBuffer_和栈上开的空间组织一起,使用gatherIO。然后把栈上读取到的数据copy到inputBuffer_。这样既一次read调用可以尽量多的读取数据,又不需要在inputBuffer预分配过多的空间。c)发送数据的时候,如果outputBuffer_上是空的,尽量直接发送出去,节省了outputBuffer_序列化的时间。这些实现都是基于muduo良好的基础设施。d)多个IO线程,缓解关键线程的压力。

4)多个IO处理线程。之前iSearch4的时候,1688的merger和searcher比例3:1,大部分是在收发数据,一个anet线程不能及时处理,因为IO线程并不是简单的read,write。它还要负责packet的解析,上层应用的回调,这些都给关键的IO的线程带来压力。所以,面对万兆网卡,或大吞吐量的应用,单个IO线程是吃力的。muduo的多IO线程的实现:1)中讲到了EventLoop 只是封装了处理事件的逻辑,和执行体线程是解耦合的。开启多IO线程时,开多个thread,每个thread绑定一个EventLoop。当一个链接建立之后,把这个链接路由给一个线程就可以了。

5)语言风格上。a)muduo大量使用了bind/function,这一对函数其实是在模仿‘闭包’的概念。把多线程并发做的事情,封装成一个个的闭包,‘线性化’到EventLoop线程的functionQueue,同步化处理。使得在99%不需要锁的地方,彻底无锁了。牺牲的仅仅是一点点的串形化。同时,有了闭包,就不必到处继承‘接口类’。是代码也简洁了一些。b)大量的使用了shared_ptr, weak_ptr管理资源,避免手工管理引用计数,像anet一样。shared_ptr,weak_ptr的性能也很客观,即使是频繁的构造析构(当然,设计上能避免就避免构造析构。


image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png


















相关文章
|
3月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
73 4
|
6天前
|
XML JSON 网络协议
超级好用的C++实用库之字节流解析器
超级好用的C++实用库之字节流解析器
11 3
|
17天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
48 3
|
6天前
|
缓存 网络协议 分布式数据库
超级好用的C++实用库之DNS解析
超级好用的C++实用库之DNS解析
17 0
|
9天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
2月前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
132 1
|
2月前
|
XML 存储 JavaScript
xml介绍与解析,及xml库包使用
xml介绍与解析,及xml库包使用
26 0
|
2月前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
41 0
|
2月前
|
测试技术 API Android开发
Android经典实战之简化 Android 相机开发:CameraX 库的全面解析
CameraX是Android Jetpack的一个组件,旨在简化相机应用开发,提供了易于使用的API并支持从Android 5.0(API级别21)起的设备。其主要特性包括广泛的设备兼容性、简洁的API、生命周期感知、简化实现及方便的集成与测试。通过简单的几个步骤即可实现如拍照、视频录制等功能。此外,还提供了最佳实践指导以确保应用的稳定性和性能。
37 0
|
3月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
53 4

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面