当前位置:网站首页>Libuv库概述及libevent、libev、libuv对比(转载)
Libuv库概述及libevent、libev、libuv对比(转载)
2022-06-29 03:47:00 【ufgnix0802】
Libuv库概述及libevent、libev、libuv对比(转载)
node.js最初发起于2009年,是一个可以让JavaScript代码脱离浏览器的执行环境,Libuv使用的是Google的V8执行引擎和Mac Lehmann的Libev。Node.js将事件驱动的I/O模型与该模型的编程语言(JavaScript)融合在一起,随着node.js的日益流行,node.js的开发者们也意识到应该让Node.js在Windows平台下也能工作,但是Libev只能在Unix环境下运行,Windows平台上与kqueue(FreeBSD)或者(e)poll(Linux)等内核事件通知相应的机制是IOCP,Libuv依据不同平台的特性(Unix平台为libev,Windows平台为IOCP)给上层应用提供了统一的基于LIbev API的抽象。
编译
Windows平台编译可参考博客:
https://blog.csdn.net/qq135595696/article/details/125435743?spm=1001.2014.3001.5501
网络库libevent、libev、libuv对比
参考链接:https://blog.csdn.net/lijinqi1987/article/details/71214974
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.js的过程中需要一个跨平台的事件库,首选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 | timer |
| 计时器(wall clock) | – | periodic | – |
| 信号 | signal | signal | signal |
| 进程控制 | – | child | process |
| 文件stat | – | stat | fs_poll |
| 每次循环都会执行的Idle事件 | – | idle | idle |
| 循环block之前执行 | – | prepare | prepare |
| 循环block之后执行 | – | 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) | |||
| event ports | |||
| kqueue(*BSD) | |||
| POSIX select | |||
| Windows select | |||
| Windows IOCP | |||
| poll | |||
| epoll |
对于Unix/Linux平台,没有什么大的不同,优先选择epoll,对于Windows,Libevent、Libev都使用select检测和分发事件,Libuv在Windows下使用IOCP。Libevent有一个socket handle,在Windows上使用IOCP进行读写。Libev没有类似的。但是Libevent的IOCP支持也不是很好(性能不高)。所以如果在Windows平台下,使用原生的IOCP进行I/O,或者使用Libuv。
异步架构程序设计的原则
- 回调函数不可以执行过长的时间,因为一个loop中可能包含其它事件,尤其是会影响一些准确度要求比较高的timer。
- 尽量采用库中所缓存的时间,有时候需要根据时间差来执行timeout之列的操作。当然能够利用库中timer最好。
边栏推荐
- 你为什么做测试/开发程序员?还能回想出来吗......
- Solid state and memory module purchase
- Data statistical analysis (SPSS) [3]
- Data statistical analysis (SPSS) [7]
- PostgreSQL 出现cross-database references are not implemented的bug
- How to back up all data on Apple mobile phone in 2 steps (free)
- 88.(cesium篇)cesium聚合图
- Data collection and management [11]
- 技术:如何设计zkVM电路
- 【资料上新】基于3568开发板的NPU开发资料全面升级
猜你喜欢

go-redsync分布式锁源码解析

为什么信息化 ≠ 数字化?终于有人讲明白了

Source code analysis of go redsync distributed lock

Why is informatization ≠ digitalization? Finally someone made it clear

分布式id解决方案

VG4131SxxxN0S1无线模块硬件规格书

人大金仓(KingBase)导出表结构

go实现分布式锁
![[tcapulusdb knowledge base] Introduction to tcapulusdb tcapsvrmgr tool (III)](/img/7b/8c4f1549054ee8c0184495d9e8e378.png)
[tcapulusdb knowledge base] Introduction to tcapulusdb tcapsvrmgr tool (III)

《运营之光3.0》全新上市——跨越时代,自我颠覆的诚意之作
随机推荐
中小型企业网络的组建
Use gstarwmr video conversion for yocto system of i.mx8m development board
技术:如何设计zkVM电路
多机局域网办公神器 rustdesk 使用强推!!!
How to back up all data on Apple mobile phone in 2 steps (free)
mysql varcahr 转 int
在命令行登录mysql数据库以及查看版本号
Data collection and management [6]
Share 60 divine vs Code plug-ins
【TcaplusDB知识库】TcaplusDB限制条件介绍
Ask the handler about the memory leak scenario in the interview. Don't just know static internal classes & weak references!
leetcode:304. 2D area and retrieval - matrix immutable
Draft competition process of Intelligent Vision Group
科技雲報道:混合辦公的B面:安全與效率如何兼得?
【世界海洋日】TcaplusDB号召你一同保护海洋生物多样性
leetcode - 295. Median data flow
Web crawler knowledge day04
MySQL复习资料(附加)case when
Data collection and management [11]
[fpga+sin] FPGA implementation of sinusoidal signal generator module based on DDS (direct digital synthesis)