原文:https://idndx.com/2013/01/05/comparison-between-libuv-and-libev/

libuv 和 libev ,两个名字相当相近的 I/O Library,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述。

高性能网络编程这个话题已经被讨论烂了。异步,异步,还是异步。不管是 epoll 也好,kqueue 也罢,总是免不了异步这个话题。

libev 是系统异步模型的简单封装,基本上来说,它解决了 epoll ,kqueuq 与 select 之间 API 不同的问题。保证使用 livev 的 API 编写出的程序可以在大多数 *nix 平台上运行。但是 libev 的缺点也是显而易见,由于基本只是封装了 Event Library,用起来有诸多不便。比如 accept(3) 连接以后需要手动 setnonblocking 。从 socket 读写时需要检测 EAGAIN 、EWOULDBLOCK 和 EINTER 。这也是大多数人认为异步程序难写的根本原因。

libuv 则显得更为高层。libuv 是 joyent 给 Node 做的一套 I/O Library 。而这也导致了 libuv 最大的特点就是处处回调。基本上只要有可能阻塞的地方,libuv 都使用回调处理。这样做实际上大大减轻了程序员的工作量。因为当回调被 call 的时候,libuv 保证你有事可做,这样 EAGAIN 和 EWOULDBLOCK 之类的 handle 就不是程序员的工作了,libuv 会默默的帮你搞定。

libev 在 socket 发生读写事件时,只告诉你,“XX socket 可以读/写了,自己看着办吧”。往往我们需要自己申请内存并调用 read(3) 或者 write(3) 来响应 I/O 事件。

libuv 则稍微复杂一些,我们分读/写两个部分来描述。

当接口可读时,libuv 会调用你的 allocate callback 来申请内存并将读到的内容写入。当读取完毕后,libuv 会 call 你为这个 socket 设置的回调函数,在参数中带着这个 buffer 的信息。你只需要负责处理这个 buffer 并且free 掉就OK了。因为是从 buffer 中读取数据,在你的 callback 被调用时数据已经 ready 了,所以程序员也就不用考虑阻塞的问题了。

而对写的处理则更显巧妙。libuv 没有 write callback ,如果你想写东西,直接 generate 一个 write request 连着要写的 buffer 一起丢给 libuv ,libuv 会把你的 write request 加进相应 socket 的 write queue ,在 I/O 可写时按顺序写入。

C 没有闭包,所以确定读写上下文是 libuv 的使用者需要面对的问题。否则程序面对汹涌而来的 buffer 也不能分得清哪个是哪个的数据。在这一点的处理上,libuv 跟 libev 一样,都是使用了一个 void *data 来解决问题。你可以用 data 这个 member 存储任何东西,这样当 buffer 来的时候,只需要简单的把 data cast 到你需要的类型就 OK 了。

libev 没有异步 DNS 解析,这一点一直广为垢病。

libuv 有异步的 DNS 解析,解析结果也是通过回调的方式通知程序。

libev 完全是单线程的。

libuv 需要多线程库支持,因为其在内部维护了一个线程池来 handle 诸如 getaddrinfo(3) 这样的无法异步的调用。

libev 貌似是作者一个人在开发,版本管理使用的还是 CVS ,社区参与度明显不高。

libuv 社区十分活跃,几乎每天都有人提出 Issue 并贡献代码。

libev 不支持 IOCP ,如果需要在 Win 下运行的程序会很麻烦。

libuv 支持 IOCP ,有相应脚本编译 Win 下的库。

libev和libuv的区别相关推荐

  1. 网络库libevent、libev、libuv、libhv对比

    网络库libevent.libev.libuv对比_小麒麟的成长之路-CSDN博客_libevent libuv Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asyn ...

  2. php libev pthreads,libuv 与 libev 的对比

    05 January 2013 libuv和libev,两个名字相当相近的 I/O Library,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述. ...

  3. 网络库libevent、libev、libuv对比

    Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library). 异步事件库本质上是提供异步事件通知(Asynchronous Ev ...

  4. 库-libuv 和 libev的对比

    From: http://blog.chinaunix.net/uid-28458801-id-4463981.html libuv 和 libev ,两个名字相当相近的 I/O Library,最近 ...

  5. libuv 和 libev的对比

    libuv 和 libev ,两个名字相当相近的 I/O Library,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述. 高性能网络编程这个话题已经 ...

  6. nio和bio的原理_Java的BIO,NIO和AIO的区别于演进

    前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...

  7. mingw使用libev

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 libev Docume ...

  8. Libuv 介绍(一)

    Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库 libevent :名气最大,应用最广泛,历史悠久的跨平台事件库: libev :较libevent而言,设计更简练,性 ...

  9. 【libuv高效编程】libuv学习超详细教程1——libuv的编译与安装

    文章目录 libuv简介 下载libuv 安装必要的依赖 拉取libuv源码 编译使用 验证编译安装是否完成 简单实用 libuv简介 libuv 是一个高性能的,事件驱动的I/O,并且支持多平台的网 ...

最新文章

  1. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用
  2. 设计模式复习-职责链模式
  3. eWeek: 三巨头Web应用服务对比
  4. 【Android】Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法
  5. 用正则表达式捕获标识符——随便说
  6. merge r语言daframe_R语言总结
  7. [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式
  8. 【干货下载】2020新基建展望:新战略、新动力、新格局.pdf(附下载链接)
  9. 用python写helloworld_使用python写一个Hello World
  10. win7系统计算机无最小化,win7纯净版系统任务栏无法显示网页最小化窗口怎么办...
  11. 21天Jmeter打卡Day19 mysql数据库提取参数化
  12. Fast DDS Fast DDS主要包括以下内容DDS API、Fast DDS-Gen、RTPS Wire Protocol
  13. Intel笔记本处理器发展简史(二)
  14. 前端实现炫酷动效_10大炫酷的HTML5文字动画特效欣赏
  15. 遥感小目标检测论文梳理
  16. 影响人生的一百条格言
  17. eclipes 安装的常用配置
  18. Mac U盘安装High Sierra
  19. DirectShow实现视频的实时显示并抓图,可以设置视频参数
  20. 【Head First 模式设计】第1章 策略模式

热门文章

  1. nginx代理离线瓦片,并在leaflet中调用
  2. Android 圆形停止按钮,跑步APP停止动画
  3. 计算机网络期末复习题
  4. 老程序员告诉你什么是大数据框架
  5. 2020.10.23--AI--小熊制作、太极制作、微信图标制作
  6. linux怎么进mysql天气_Linux命令行怎么浏览天气预报
  7. 面试常问MySQL性能优化问题
  8. realloc重分配内存详解_羽夜水之灵_百度空间
  9. linux中级工程师面试题,Linux运维中级工程师面试题
  10. 东软python培训