【C++】libevent 、libev、 libuv 、asio、 muduo、 ace 等C++ 网络库

首先排除preactor模式的(难写),即asio和ACE;其次,尽量选用多进程单线程(简单可横向扩展)的,可以参考nginx。

整体感觉:ACE太庞大,asio 太赶时髦。

ACE太过庞大,使得你即便是只使用它的一小部分,也不得不引用它的全部。而且框架一大堆,模式一个加一个,很多编程习惯也要改变。学习曲线太陡,也难以将它作为一个模块集成自己的应用。

asio呢,有个牛大大说它是现时代的ACE,我觉得比较中肯。用bind做回调也并不比虚函数好,看上去灵活了,代价却更高了。我说的不光是运行时的内存和时间代价,更重要的编译时间难以忍受。

apr大约只是一个平台无关的api封装,相对来说比较轻量级。

libevent就更轻量级了,轻量级到无法把它当成一个平台无关的socket,还要写很多平台相关的代码。

相比而下,我觉得apr还好点,其实我需要的只是一个机制,而不是一个完整的策略,这是unix的哲学。如果仅就异步通讯来说,我觉得linux.epoll是最好的,简单、直接、有效,如果在每个平台上都有epoll可用,所有其它封装在我看来都是多余的了。

proactor真的就比reactor高效吗?它更多的是一种策略,据说Windows的操作系统级IOCP是用线程池实现的,它能高效到哪里去?

2. Libevent,libuv,libev,IOCP,asio,muduo,tbnet都是网络函数库
Libevent、libev、libuv三个网络库,都是C语言实现的异步事件库(Asynchronousevent library),异步事件通知机制就是根据发生的事件,调用相应的回调函数进行处理。

对比下三个库:

libevent :名气最大,应用最广泛,历史悠久的跨平台事件库;

libev :较libevent而言,设计更简练,性能更好,但对Windows支持不够好;

libuv :开发node的过程中需要一个跨平台的事件库,他们首选了libev,但又要支持Windows,故重新封装了一套,linux下用libev实现,Windows下用IOCP实现;

康康github上的start感觉感觉他们的影响力 (libuv >> libevent > libev):

https://github.com/libevent/libevent
https://github.com/enki/libev
https://github.com/libuv/libuv
 

5.boost::asio

C++语言跨平台。用bind做回调也并不比虚函数好,看上去灵活了,代价却更高了。不光是运行时的内存和时间代价,编译时间也更长。基于ASIO开发应用,要求程序员熟悉函数对象,函数指针,熟悉boost库中的boost::bind,内存管理控制方面。

asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。

考虑到asio的使用,对现有系统的改造难度大,排除。

6.Muduo

这是一个用纯c++写的库,仅在linux下使用,one loop per thread的思想贯穿其中,将I/O 定时 信号都通过文件描述符的方式融合在一起,三类事件等同于一类事件来看待。因仅在linux下使用,故而排除。
 

特性

                       libevent

 libev

 libuv

  

优先级

激活的事件组织在优先级队列中,各类事

件默认的优先级是相同的,可以通过设置

事件的优先级使其优先被处理

也是通过优先级队列来管理激活的时间,

也可以设置事件优先级

没有优先级概念,按照固定的顺序访

问各类事件

事件循环    

    event_base用于管理事件

激活的事件组织在优先级队列中,各类事件默认的优先级是相同的,

可以通  过设置事件的优先级   使其优先被处理

线程安全

event_base和loop都不是线程安全的,一个event_base或loop实例只能在用户的一个线程内访问(一般是主线程),注册到event_base或者loop的event都是串行访问的,即每个执行过程中,会按照优先级顺序访问已经激活的事件,执行其回调函数。所以在仅使用一个event_base或loop的情况下,回调函数的执行不存在并行关系

 事件种类

type

libevent

libev

libuv

IO

fd

io

fs_event

计时器(mono clock)

timer

timer

timter

计时器(wall clock)

--

periodic

--

信号

signal

signal

signal

进程控制

--

child

process

文件stat

--

stat

fs_poll

每次循环都会执行的Idle事件

--

idle

idle

循环block之前执行

--

prepare

prepare

循环blcck之后执行

--

check

check

嵌套loop

--

embed

--

fork

--

fork

--

loop销毁之前的清理工作

--

cleanup

--

操作另一个线程中的loop

--

async

async

stream ( tcp, pipe, tty )

stream ( tcp, pipe, tty )

stream ( tcp, pipe, tty )

stream ( tcp, pipe, tty )

 

可移植性

三个库都支持Linux, *BSD, Mac OS X, Solaris, Windows

type

libevent

libev

libuv

dev/poll (Solaris)

y

y

y

event ports

y

y

y

kqueue (*BSD)

y

y

y

POSIX select

y

y

y

Windows select

y

y

y

Windows IOCP

y

N

y

poll

y

y

y

epoll

y

y

y

摘自:https://blog.csdn.net/dianfu2892/article/details/101466823

发布了583 篇原创文章 · 获赞 96 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/bandaoyu/article/details/105406884