网络库libevent、libev、libuv对比
Libevent、libev、libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library)。
异步事件库本质上是提供异步事件通知(Asynchronous Event Notification,AEN)的。异步事件通知机制就是根据发生的事件,调用相应的回调函数进行处理。
事件(Event):事件是异步事件通知机制的核心,比如fd事件、超时事件、信号事件、定时器事件。有时候也称事件为事件处理器(EventHandler),这个名称更形象,因为Handler本身表示了包含处理所需数据(或数据的地址)和处理的方法(回调函数),更像是面向对象思想中的称谓。
事件循环(EventLoop):等待并分发事件。事件循环用于管理事件。
对于应用程序来说,这些只是异步事件库提供的API,封装了异步事件库跟操作系统的交互,异步事件库会选择一种操作系统提供的机制来实现某一种事件,比如利用Unix/Linux平台的epoll机制实现网络IO事件,在同时存在多种机制可以利用时,异步事件库会采用最优机制。
对比下三个库:
libevent :名气最大,应用最广泛,历史悠久的跨平台事件库;
libev :较libevent而言,设计更简练,性能更好,但对Windows支持不够好;
libuv :开发node的过程中需要一个跨平台的事件库,他们首选了libev,但又要支持Windows,故重新封装了一套,linux下用libev实现,Windows下用IOCP实现;
在github上的影响力:
可见,目前libuv的影响力最大,其次是libevent,libev关注的人较少。
优先级、事件循环、线程安全维度的对比
|
特性 |
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 ) |
这个对比对于libev和libuv更有意义,对于libevent,很多都是跟其设计思想有关的。 libev中的embed很少用,libuv没有也没关系;cleanup完全可以用libuv中的async_exit来替代;libuv没有fork事件。
可移植性
三个库都支持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 |
对于Unix/Linux平台,没有什么大不同,优先选择epoll,对于windows,libevent、libev都使用select检测和分发事件(不I/O),libuv在windows下使用IOCP。libevent有一个socket handle, 在windows上使用IOCP进行读写。libev没有类似的。但是libevent的IOCP支持也不是很好(性能不高)。所以如果是在windows平台下,使用原生的IOCP进行I/O,或者使用libuv。
异步架构程序设计原则
1、回调函数不可以执行过长时间,因为一个loop中可能包含其他事件,尤其是会影响一些准确度要求比较高的timer。
2、尽量采用库中所缓存的时间,有时候需要根据时间差来执行timeout之类的操作。当然能够利用库中的timer最好。
参考:http://zheolong.github.io/blog/libevent-libev-libuv/
https://cpp.libhunt.com/
网络库libevent、libev、libuv对比的更多相关文章
- [原]网络库libevent在Visual Studio中的使用方法
libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名分布式缓存软件memcached也 ...
- 轻量级网络库libevent概况
Libevent is a library for writing fast portable nonblocking IO. libevent是一个为编写快速可移植的非阻塞IO程序而设计的. lib ...
- 轻量级网络库libevent初探
本文是关于libevent库第一篇博文,主要由例子来说明如何利用该库.后续博文再深入研究该库原理. libevent库简介 就如libevent官网上所写的“libevent - an event n ...
- Mudo C++网络库第十一章学习笔记
反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...
- 开源网络库ACE、Boost的ASIO、libevent、libev、ZeroMQ
开源C/C++网络库:ACE C++语言 跨平台Boost的ASIO C++语言 跨平台libevent C语言 主要支持linux,新版增加了对windows的IOC ...
- libuv 与 libev 的对比
libuv 与 libev 的对比 libuv 与 libev 的对比 05 January 2013 libuv 和 libev ,两个名字相当相近的 I/O Library,最近有幸用两个 Lib ...
- Windows下libevent C++封装类实现(为什么要使用封装好的网络库?)
题记 windows平台下对于服务器高并发的网络模型选型中,使用libevent是个不错的选择. 本文的背景基于:国内博客对于libevent大多介绍linux实现,大多是c语言的实现,Windows ...
- libevent网络库
1.概述 libevent是一个C语言编写的.轻量级开源高性能事件通知库.作为底层网络库,已经被广泛应用(如:memcached.Vomit.Nylon.Netchat等).主要有以下几个亮点: 事件 ...
- 以libevent网络库为引:网络通信和多线程
1. windows下编译及使用libevent http://www.cnblogs.com/luxiaoxun/p/3603399.html 2. <<libevent学习资料&g ...
随机推荐
- python学习-- 在django中,执行原始sql语句
from django.shortcuts import render, redirect from news.models import Article, Column def test(reque ...
- python 中单例模式
1.什么是单例模式: 单例模式是指一个类有且只有一个实例对象,创建一个实例对象后,再创建实例是返回上一次的对象引用.(简单的讲就是两个实例对象的ID相同,节省了内存空间) 2.单例模式的创建: 举例创 ...
- 正则表达式re模块的详解-python
1.元字符([ ]),它用来指定一个character class.所谓character classes就是你想要匹配的字符(character)的集合.字符(character)可以单个的列出,也 ...
- JavaWeb笔记(一)JDBC
基本步骤 导入MySQL驱动jar包 mysql-connector-java-8.0.15.zip 注册驱动 获取数据库连接对象Connection 定义sql 获取执行sql语句的对象Statem ...
- 第二个python自动化练习
#Author:xiaoxiao from selenium import webdriver import unittest class DownLoad(unittest.TestCase): # ...
- KM算法【带权二分图完美匹配】
先orz litble--KM算法 为什么要用KM算法 因为有的题丧心病狂卡费用流 KM算法相比于费用流来说,具有更高的效率. 算法流程 我们给每一个点设一个期望值[可行顶标] 对于左边的点来说,就是 ...
- topK问题解法
topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题. 堆排解决topK问题的思路,取出前K个数,最重要的就是要减少比较的次数,用堆排维护一个K大小的堆,比如一个小顶堆,则堆顶为堆中最小的值,将堆 ...
- 基里巴斯(path)
基里巴斯(path) 题目描述 最近,帕特里克沉迷于世界地图上的太平洋地区.他发现了一个名字奇异的岛国:基里巴斯共和国,简称基里巴斯,是一个太平洋岛国. 其由33个岛屿组成. "可惜它快被淹 ...
- Python之文件操作:经验总结
1.怎么判断读出来的文件是gbk还是utf-8编码 if content == u'中国'.encode('gbk'): return 'gbk' elif content == u'中国'. ...
- 【09】node 之 fs流读写
前面我们已经学习了如何使用fs模块中的readFile方法.readFileSync方法读取文件中内容,及如何使用fs模块中的writeFile方法.writeFileSync方法向一个文件写入内容. ...