网络库libevent、libev、libuv对比

2023-05-16

Libeventlibevlibuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library

异步事件库本质上是提供异步事件通知(Asynchronous Event NotificationAEN)的。异步事件通知机制就是根据发生的事件,调用相应的回调函数进行处理。

事件(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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络库libevent、libev、libuv对比 的相关文章

  • Qt5.12.11交叉编译+64位ARM_aarch64+全志H5 CortexA53

    1 准备工作 购买的H5开发板 xff0c 附带资料里面只有关于qt4 8的支持 xff0c Qt5新增了很多插件 xff0c 为了在H5上运行Qt5的程序 xff0c 需要交叉编译Qt5版本的源码 xff0c 记录下编译Qt5 12 11
  • ESP32接入百度云,在线语音识别

    1开发环境及工具 开发板使用的是ESP32 LyraTv4 3 入下图所示 xff0c 开环境在是在Ubuntu20 04上搭建的ESP IDF xff0c 在ESP IDF中添加了支持语音开发的sdk xff0c ESP ADF 2开发过
  • ARM 7 三级 中断流水线

    ARM 7 在冯诺依曼 结构的 是三级流水线技术 分别是 取址 译码 执行 当有BL 的指令 执行时 流水线 也会被阻断 在分支指令执行的时候 其后第一条指令 被 解码 第二条 指令 被 取址 xff0c 当前的PC指针是 指在取址这的 x
  • S5PC100 I2C总线

    I2C 使用2根双向信号线来传递数据 SCL 时钟线 SDA 数据线 特点 半双功 xff0c 仅需要2根线 一般在PCU 上占2个PIN I2C 总线 上 都是 oc od 输出 xff0c 所以使用上拉电阻 当总线空闲的时候 都是输出
  • java代码自动生成一(freemarker)

    size 61 large 网上有很多代码自动生成工具 xff0c 如abator和hibernate xff0c 这些工具虽好 xff0c 却没有源码 xff0c 不能修改模板 xff0c 让人很不爽 我刚毕业的时候 xff0c 项目经理
  • linux内核 2.6.35下的驱动例子

    创建 设备节点 mknod dev hello c 字符设备 或者b xff08 块设备 xff09 250 1 查看 cat proc devices 当前设备节点 insmod 安装 rmmod 删除 编译 Makefile 1 需要配
  • E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    出现这个问题的原因可能是有另外一个程序正在运行 xff0c 导致资源被锁不可用 而导致资源被锁的原因 xff0c 可能是上次安装时没正常完成 xff0c 而导致出现此状况 解决方法 xff1a 输入以下命令 sudo rm var cach
  • shell 脚本中的引用问题

    原始代码如下 bin sh myvar 61 34 Hello world 34 echo myvar echo 34 myvar 34 echo 39 myvar 39 echo myvar echo Enter some test re
  • Linux内核的TCP源码入门(一)

    文章目录 前言一 TCP报文段结构1 报文段整体结构2 TCP首部 固定部分3 TCP首部 选项 options 二 TCP接收和发送数据1 TCP的 34 接口 34 2 发送数据3 接收数据3 1 ip层向上调用INET Socket层
  • 【API接口工具】postman-Windows版、Linux安装

    Windows安装 Postman 适用于 Windows 7 及更高版本 下载最新的 Postman 版本 选择并运行该 exe文件以安装 Postman Postman v9 4 是 Postman 的最后一个版本 xff0c 同时支持
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 穿越机用途和机架尺寸

    穿越机用途和机架尺寸 1 穿越机的用途2 穿越机的机架3 机架的类型3 1 正X型机架3 2 宽X型机架3 3 长X型机架3 4 Hybrid机架3 5 涵道机架 4 总结 1 穿越机的用途 穿越机按功能分 xff0c 主要分为竞速Race
  • 关于穿越机FPV视频果冻效应的讨论

    关于穿越机FPV视频果冻效应的讨论 1 名词定义2 摄像原理2 1 快门分类2 2 常见传感器2 3 卷帘拍摄 3 产生原因4 解决方法4 1 振动出处4 2 软件方法 辅助作用 4 3 硬件方法 直接办法 5 F450试验机FPV视频问题
  • 四轴飞控DIY Mark4 - 减震

    四轴飞控DIY Mark4 减震 1 DIY Mark42 改进事项2 1 Mark4 5 inches机架2 2 2205 2450KV 无刷电机2 3 电机与机架的TPU防震2 4 飞控防震垫圈2 5 三叶平衡桨 3 试飞效果3 1 视
  • Java的压力测试工具之Jmeter

    size 61 large Apache JMeter是Apache组织开发的基于Java的压力测试工具 用于对软件做压力测试 xff0c 它最初被设计用于Web应用测试但后来扩展到其他测试领域 它可以用于测试静态和动态资源例如静态文件 J
  • 四轴飞控DIY Mark4 - 整理&参数优化

    四轴飞控DIY Mark4 整理 amp 参数优化 1 历程2 参数优化2 1 固件BF4 3 12 2 动态怠速值2 3 滤波参数2 4 电调PWM频率2 5 GPS高度配置2 6 返航速度和高度2 7 线性推力修正2 8 图传频道调整
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot开源飞控系统之简单介绍 1 源由2 了解 amp 阅读2 1 ArduPilot历史2 2 关于GPLv32 3 ArduPilot系统组成2 4 ArduPilot代码结构 3 后续3 1 DIY F4503 2 软件设
  • ArduPilot Kakute F7 AIO DIYF450 之GPS配置

    ArduPilot Kakute F7 AIO DIYF450 之GPS配置 1 源由2 步骤2 1 模块预测试2 2 物理连接2 3 UART配置2 4 Compass使能2 5 GPS使能2 6 校准Compass 3 GPS amp
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP

随机推荐

  • COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法

    提出背景 xff1a 长距离寻路会出现掉帧现象 xff0c 为了提高寻路速度 xff0c 并为3D环境中的寻路方案提供基础算法实现 目前状况 xff1a 由于3D游戏对帧率要求很高 xff0c 而在游戏中进行一次长距离的寻路可能要花费8 1
  • 解析串口-接收完整数据帧

    在linux下编写串口通讯程序 xff0c 采用select监听串口的可读事件 xff0c 一旦可读 xff0c 调用read 但是我们会发现 xff0c read一次得到的数据通常不是完整的一个数据帧 比如完整数据帧为 但是实际上需要re
  • STL 基本容器 优缺点比较

    总结在先 xff1a xff11 如果需要高效的随机存取 xff0c 不在乎插入和删除的效率 xff0c 使用vector xff1b 2 如果需要大量的插入和删除元素 xff0c 不关心随机存取的效率 xff0c 使用list xff1b
  • STL源码剖析--vector容器

    写在前面 vector是我们在STL中最常用的容器 xff0c 我们对它的各种操作也都了然于胸 然而我们在使用vector的时候总会有一种很虚的感觉 xff0c 因为我们不清楚接口内部是如何实现的 在我们眼里宛如一个黑箱 xff0c 既危险
  • TCP/UDP调试工具的使用

    TCP UDP调试工具下载链接 前文 当我们写好一个TCP UDP的程序时 但是无法通信时 光看代码又找不出原因时 我们可以借助调试工具来检查是服务端还是客户端出现了问题 这样就很大的减少了错误的排查范围 再次感叹一下 这个工具真的很好用
  • 关于利用结构体和联合体数据收发的两种方法

    关于利用结构体和联合体数据收发的两种方法 关于最近接手的小项目 xff0c 有了一些经验 xff0c 所以进行一下记录 文章目录 关于利用结构体和联合体数据收发的两种方法前言一 联合体法二 结构体法小tips 前言 在我们利用自己的板子进行
  • RESTful初探之四(Restlets)

    size 61 large Restlets Restlet项目为 建立REST概念与Java类之间的映射 提供了一个轻量级而全面的框架 它可用于实现任何种类的REST式系统 xff0c 而不仅仅是REST式Web服务 color 61 r
  • FreeRTOS中的堆栈设置”与“系统启动文件中堆栈”的关系

    FreeRTOS中的堆栈设置 与 系统启动文件中堆栈 的关系 在STM32CubeMX生成工程时发现 xff0c 在FreeRTOS的配置中同样有TOTAL HEAP SIZE堆的大小配置 xff0c 这个堆与之前系统的堆空间有什么区别呢
  • nodejs 实现http账号密码Digest登录认证

    const http 61 require 39 http 39 const qs 61 require 39 querystring 39 const md5 61 require 39 md5 node 39 第一步 xff1a 获取n
  • PCB Layout各层含义与分层原则

    内容包括 PCB绘图软件各层含义的详细介绍以及一些在实际工作中的应用 xff0c Layout时多层板分层原则与阻抗匹配 紫色文字是超链接 xff0c 点击自动跳转至相关博文 持续更新 xff0c 原创不易 xff01 目录 xff1a 一
  • 2021-01-18

    求助 xff0c 关于Ubuntu20 04安装网络调试助手打不开的问题 我在虚拟机上安装了Ubuntu20 04并安装了网络调试助手 xff0c 但却打不开 xff0c 运用了sudo apt get libqtgui4 amd64也没用
  • 笔记:VSCode C/C++ 格式化修改设置

    VSCode安装C C 43 43 插件后 xff0c 就有了格式化代码的能力 xff0c 这个功能很好用 xff0c 一般来说不用改就可以用的很嗨皮 为啥要改默认设置 xff0c 只因不喜欢函数内大括号独占一行 xff0c 如此一屏显示的
  • NEMA 协议:GPRMC数据格式

    NEMA协议的由来 NMEA协议是为了在不同的GPS xff08 全球定位系统 xff09 导航设备中建立统一的BTCM xff08 海事无线电技术委员会 xff09 标准 xff0c 由美国国家海洋电子协会 xff08 NMEA The
  • 大小端(网络字节序)等概念

    1 大小端定义 大端存储模式 xff1a 是指数据的低位字节序保存在内存的高地址中 xff0c 而数据的高位字节序保存在内存的低地址中 小端存储模式 xff1a 是指数据的低位字节序保存在内存的低地址中 xff0c 而数据的高位字节序保存在
  • [李景山php]RHEL\CentOS 7\ubuntu16.04 下 MySQL 连接数被限制为214个

    问题 项目中 xff0c 由于连接数过多 xff0c 提示 Too many connections xff0c 需要增加连接数 我在 etc my cnf中修改了 max connections 61 2000 但是 xff0c 实际连接
  • 关系型数据库和非关系型数据库的特性以及各自的优缺点

    数据库 类型特性优点缺点关系型数据库 SQLite Oracle mysql1 关系型数据库 xff0c 是指采用了关系模型来组织 数据的数据库 xff1b 2 关系型数据库的最大特点就是事务的一致性 xff1b 3 简单来说 xff0c
  • 采用libuv的epoll方式实现的异步高性能libcurl发送数据的方法

    Libcurl较为基本的用法是easyinterface xff0c 它是最简单的同步接口 xff0c 容易理解 xff0c 实现代码简单 xff0c 但是性能低下 curl multi perform 43 select xff1a 可以
  • 各种浏览器语言包、国际化如何配置

    size 61 large 如果web项目使用了国际化多语言包 xff0c 切换浏览器语言包可以切换语言 xff1a color 61 red Firefox如何中英文切换 color 首先得下载语言包 xff0c 网址 xff1a url
  • libcurl采用curl_multi_perform() + curl_multi_wait()方式实现异步高性能l发送数据的方法

    前两篇文章 c c 43 43 调用libcurl库发送http请求的两种基本用法 采用libuv的epoll方式实现的异步高性能libcurl发送数据的方法 讲述了采用libcurl发送数据的基础方法和高性能方法 xff0c 基础方法较为
  • 网络库libevent、libev、libuv对比

    Libevent libev libuv 三个网络库 xff0c 都是c 语言实现的异步事件库Asynchronousevent library xff09 异步事件库本质上是提供异步事件通知 xff08 Asynchronous Even