各种网络库比较 asio libevent

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

libevent

libev

libuv

node.js

 

工具库和框架之间的区别,asio是被设计成一套工具库而不是框架。

什么是框架? 框架就是一套固定了编程结构的库,任何用户使用它,必须按照框架库的结构设计自己的应用,比如MFC中的OnOK, OnXXX之类,又或者ACE中的ACE_Handler::handle_xxx_yyy之类,用户通过在这些派生类的虚函数中实现自己需要的处理。  

什么是工具库? 而工具库就是一套api,而不是框架,用户使用它,无需从指定的地方去填写代码。程序的框架由用户自己决定。类似的库有C++中的STL,C中的标准库,它们从来不提供编程框架,而只提供工具函数,让用户通过这些工具函数,正确的组织自己的程序结构。 

框架的限制非常多,不够灵活

 

https://www.avboost.com/t/topic/654

 

select

select 实在是太慢了.

在这种背景下, IBM 老大哥带领着MS老弟先搞了 IOCP . 然而开源的人有开源的做法, 在 NIH 综合症的影响下, BSD 的人敢为天下所不齿, 发明了 Kqueue. 同样在 NIH 综合症影响下, Linux 的一群 M* 的猴子捣鼓出了 epoll.

分裂, 让人头疼.

于是程序员们急需一个上天入地无所不能的法宝的法宝, 把这3家法宝给统御起来.率先站出来悳瑟的是 ACE.

ACE 过于复杂,甚至比它试图封装的对象更复杂

libevent 就如名字所言,是一个异步事件框架。

libevent把简单问题简单化,让异步网络编程反朴归真,应该来说,本是一个好库。

然而 libevent 因为设计缺陷,例如使用全局变量,定时器无法处理时间跳变,诸如此类的设计缺陷导致了 libev 的出现。
libev 就是为了克服libevent的缺陷而诞生的。然而,libev 就一定好了吗?

 

libev 带着对 libevent 的怨气出世了。

 

编写异步程序, 最需要的2个抽象能力, 其一为协程,其二是函数对象,包括匿名函数对象, 也就是lambda。
C统统没有。函数对象是实现闭包比不可少的,如果没有函数对象, 就只能通过携带 void* 指针的形式迂回完整,繁琐不说,还特别容易出错。

 

尽管C 有那么多缺点,然而 libev 还未来得及被C的缺点拖累,因为他不支持 IOCP. 于是 libuv 就出来给 libev 擦屁股了。 

libuv 可以说是 C 语言的异步库所能达到的最高高度了。完完全全的触碰到了C语言的自身瓶颈,好在 libuv 只是 nodejs 的底层库,上层软件转移到 javascript 语言而逃避了 C 的禁锢。

 

ASIO 腾空出世

在地球最大的岛上,另一位少年开始拜读 ACE 的大作。那时候,没有 libuv 没有 libev 更没有 libevent . 有的只是 ACE.

少年在一次开发者大会的演讲上,再次透露,网络库不宜做成框架,而是要像系统的API那样,作为一个乐高积木。ACE 做成了一个框架,同样不妥。

 

buffers

有了闭包的支持,内存管理也变得轻轻松松起来。
ASIO 本身并不管理内存,所有的IO操作,只提交对用户管理的内存的引用,称 Buffers。asio::buffers 引用了用户提交的内存,保持整个 IO 期间,这块内存的有效性是用户的责任。然而这并不难!
因为回调是一个闭包。通过闭包持有内存,只要 asio 还未回调,闭包就在,闭包在,内存在。asio 在调用完回调后才删除相应的闭包。因此资源管理的责任可以丢给闭包,而闭包可以通过智能指针精确的控制内存。
不是 GC , 胜于 GC 千百倍!益于c++的 RAII机制,再无内存泄漏之忧!

 

asio采用proactor模式,而windows下的IOCP本身就是这个模式的体现

在高性能服务器并发模型设计中,Reactor和Proactor是两个经常用到的设计模式,前者用于同步IO,后者用于异步IO,前者在IO操作 就绪的情况下通知用户,用户再采取实际的IO操作,后者是在IO操作完成后通知用户。

IOCP的设计就是Proactor 模式的完美体现,而epoll则很容易实现Reactor模式,asio设计为跨平台,并且在linux下采用epoll,我的印象中linux对异步 IO的支持没有windows那么完善(看看IOCP和epoll模型的区别就知道),那么asio是怎么用epoll机制实现proactor模式的 呢,刚开始想的是应该在应用层做了一层封装,就是asio内部应该有某个循环调用epoll_wait,当有IO事件就绪时帮用户做一些操作(比如把数据 拷贝到我们提交的缓冲区),然后在操作完成的时候调用我们的handler(后来看代码基本是这样).OK,不说废话了.

 

本质上来讲libevent应该是同步的因为如果看到底层封装的select和epoll就会发现,里面仍然是个while循环,在不停的询问,是否准备就绪,
而异步同步IO的主要区别就是,应用发起一个 IO 操作以后,不等待内核 IO 操作的完成,等内核完成 IO 操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问 IO 是否完成,显然select和epoll是同步的。
另外本身Reactor模式就是同步的模式不是吗?


如果你理解底层的select或者epoll。你会发现它其实是同步的。有一个while循环,等待事件触发条件。满足条件则调用相应的callback函数。因此本质上还是同步的。不过长了一个异步的脸
libevent本身是一个Reactor,是同步的。但libevent的bufferevent是用Reactor实现了一个Proactor,所以libevent又是异步的
【C++】libevent 、libev、 libuv 、asio、 muduo、 ace 等C++ 网络 首先排除preactor模式的(难写),即asio和ACE;其次,尽量选用多进程单线程(简单可横向扩展)的,可以参考nginx。 整体感觉:ACE太庞大,asio 太赶时髦。 ACE太过庞大,使得你即便是只使用它的一小部分,也不得不引用它的全部。而且框架一大堆,模式一个加一个,很多编程习惯也要改变。学习曲线太陡,也难以将它作为一个模块集成自己的应用。 asio呢,有个牛大大说它是现时代... 阅读详情

相关推荐

开源网络库boost.asiolibevent,mongoose学习记录以及多线程模式的实现

  目录 IO操作:  IO多路复用(select,poll,epoll) select: poll: epoll: 异步IO(iocp,epoll) Libevent Boost.asio Mongoose 总结:    首先说明一下几个基础概念:      IO操作: IO操作包括两个部分:       等待数据准备好:对于一个套接口上的操作,这一步骤关系...

夏末dē黄昏 6779

一个简单易用的轻量化的c++网络

c++的网络库有很多,作为一个合格的后端开发工程师,很多人或多或少都手撸过TCP通信模块,原因都是因为网上的轮子多是面向通用化的需求,在各自项目中还是需要对轮子进行一定的加工,比如著名的asio,它只实现了对网络字节流的高效收发方面的处理,剩下的事情需要自行完成,很难使用它快速开发网络服务。一个简单易用的网络库,应该可以使用少量的代码实现一个网络服务,不需要过多关注网络通信层面的细节,只需要实现自己的业务逻辑。接下来我们只需要创建服务器和客户端, 创建必要的链接,ping-pong测试就完成了。

itnkcong的博客 1676

网络库的使用(libevent、ACE、boost::asio)

react、proact模式比较

pzs0221的专栏 2327

C++常用的一些网络

C++网络通信库

heusunduo88的博客 9434

C++ 网络库:libevent、libev、libuv、poco、libhv、asi、ace、QUIC 协议

C++ 网络库:libevent、libev、libuv、poco、libhv、asi、ace

freeking101的博客 1万+

开源网络库比较 ACE、ASIOlibevent

开源C/C++网络库: ACE           C++语言 跨平台 Boost的ASIO   C++语言 跨平台 libevent     C语言   主要支持linux,新版增加了对windows的IOCP的支持 libev         C语言   只支持linux,只封装了EPOLL模型 层次架构: ACE:底层是OS适配层,上一层C++的wrap类,再上一

逆枫 -- C++/Qt工程师、创业者 3654

开源C/C++网络库比较 ace bosst libevent

ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候, 要根据情况,看你从那一层来进行使用。   在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO。   ACE是一个大型的中间件产品,代码20万行左右

huanggang982的专栏 954

开源C/C++网络库比较 ace &&bosst

ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候, 要根据情况,看你从那一层来进行使用。   在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO。   ACE是一个大型的中间件产品,代码20万行左右,过于宏

woodsp的专栏 1752

开源C/C++网络库比较 ace &&bosst &&libEvent

ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候, 要根据情况,看你从那一层来进行使用。   在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO。   ACE是一个大型的中间件产品,代码20万行左右

varyall的专栏 2254

C++ 高性能服务器 网络库介绍

1.大型高并发,高性能 2.异步IO 3.均衡负载 multi-reactor服务器模型的C++封装类(libevent+多线程实现) libevent:这是在网上找的资料,libevent并不是线程安全,但不代表其不支持多线程。memcache的网络部分使用libevent,有一个经典的图描述了其多线程实现: 高性能、高并发TCP服务器(多线程调用libevent) ht...

BlueBirdssh的专栏 2080

开源C/C++网络库比较 http://blog.csdn.net/langeldep/article/details/6976120

开源C/C++网络库比较 分类: Linux操作与使用 学习C/C++经验2011-11-16 11:24 32836人阅读 评论(8) 收藏 举报 网络设计模式freebsdlinux框架跨平台 在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost

诺尔曼 1136

网络库总结

开源C/C++网络库比较 http://blog.csdn.net/langeldep/article/details/6976120 在开源的C/C++网络库中,常用的就那么几个,在业界知名度最高的,应该是ACE了,不过是个重量级的大家伙,轻量级的有libevent, libev,还有 Boost的ASIO。 ACEhttp://www.cs.wustl.edu/~schmid

lishenglong666的专栏 844
上一篇: 开源C/C++网络库比较 ace &&bosst &&libEvent
下一篇: select、poll、epoll之间的区别总结[整理]
羊儿葫芦贝尔
博客等级 码龄16年 34粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值