首先排除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