《Muduo 多线程网络库解析》

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 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


















相关文章
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
848 29
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
254 4
|
数据采集 JavaScript API
网页解析库:BeautifulSoup与Cheerio的选择
网页解析库:BeautifulSoup与Cheerio的选择
|
SQL Oracle 关系型数据库
SQL整库导出语录:全面解析与高效执行策略
在数据库管理和维护过程中,整库导出是一项常见的需求,无论是为了备份、迁移还是数据分析,掌握如何高效、准确地导出整个数据库至关重要
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
608 0
|
前端开发 JavaScript
pyquery:一个灵活方便的 HTML 解析库
pyquery:一个灵活方便的 HTML 解析库
141 1
|
XML JSON 网络协议
超级好用的C++实用库之字节流解析器
超级好用的C++实用库之字节流解析器
193 3
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
301 3
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
530 1
|
缓存 网络协议 分布式数据库
超级好用的C++实用库之DNS解析
超级好用的C++实用库之DNS解析
304 0

热门文章

最新文章

推荐镜像

更多
  • DNS