libuv 与 libev 的对比

libuv 与 libev 的对比

05 January 2013

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

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

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

libuv 则显得更为高层。libuv 是 joyent 给 Node 做的一套 I/O Library 。而这也导致了 libuv 最大的特点就是处处回调。基本上只要有可能阻塞的地方,libuv 都使用回调处理。这样做实际上大大减轻了程序员的工作量。因为当回调被 call 的时候,libuv 保证你有事可做,这样 EAGAINEWOULDBLOCK 之类的 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 一起丢给 libuvlibuv 会把你的 write request 加进相应 socket 的 write queue ,在 I/O 可写时按顺序写入。

C 没有闭包,所以确定读写上下文是 libuv 的使用者需要面对的问题。否则程序面对汹涌而来的 buffer 也不能分得清哪个是哪个的数据。在这一点的处理上,libuvlibev 一样,都是使用了一个 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 下的库。

libuv 与 libev 的对比相关推荐

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

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

  2. 库-libuv 和 libev的对比

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

  3. libuv 和 libev的对比

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

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

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

  5. libev和libuv的区别

    原文:https://idndx.com/2013/01/05/comparison-between-libuv-and-libev/ libuv 和 libev ,两个名字相当相近的 I/O Lib ...

  6. libuv 高性能 事件驱动 跨平台 i/o库 简介

    目录 1.Introduction 简介 Who this book is for Background Code 2.Basics of libuv libuv基础 Event loops HELL ...

  7. libuv 中文编程指南

    最近看了一些有关 libuv 的东西,另外复习了一些与同步.异步.阻塞.非阻塞,异步IO(aio)的东西, 算是技术积累吧,等有时间了整理出一个完整的文档出来,希望在今后的编程中用到. 不多说了,本文 ...

  8. 库-libuv:概述

    From: http://blog.chinaunix.net/uid-28458801-id-4464173.html libuv 是 Node 的新跨平台抽象层,用于抽象 Windows 的 IO ...

  9. 跨平台异步IO库 libuv 源代码接口详解

    Table of Contents 简介 谁这本书是为 背景 代码 libuv的基础知识 事件循环 helloworld 默认循环 错误处理 把手和要求 空转 存储方面 文件系统 读/写文件 文件系统 ...

  10. 偷懒的网络框架libevent、libev框架介绍

    libevent.libev框架介绍 前言 概述 libevent 编译安装libevent libevent的封装层次 IO事件检测的封装与api介绍 事件管理器event_base `构建事件管理 ...

最新文章

  1. firebug 的使用
  2. 如何在无人机上部署YOLOv4
  3. 通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载及原理解说
  4. 3D几何图形的生成算法
  5. 一个简单的Spring的AOP例子(JAVA面向切面编程)
  6. XP系统限制修改IP有新招
  7. java hashedmap_Java基础 - Map接口的实现类 : HashedMap / LinkedHashMap /TreeMap 的构造/修改/遍历/ 集合视图方法/双向迭代输出...
  8. Spring注解之@Transactional对于事务异常的处理
  9. php-fpm 超时,PHP超时的坑
  10. CF1592E Bored Bakry(二进制+前缀异或和)
  11. 盒子模型(悬挂式布局)
  12. python - - 函数 - - 递归函数
  13. C++11 emplace操作
  14. Mar9th 海尔java面试
  15. 计算机无法识别手机设备,电脑不识别手机内部存储设备了,怎么回事
  16. win10升级2004失败?
  17. Android 日历自定义文本
  18. 5G基站耗电剑指4G基站水平,通过IMT-2020(5G)大会看5G发展趋势
  19. chloe.mysql 源码_AceFx-基于Nfine的Chloe官网及后台源码
  20. 特殊符号大全(无穷的想象力)

热门文章

  1. vue如何获取tree当前选中的节点_vue Treeselect树形下拉框之获取选中节点的ids和lables操作...
  2. WIN10网络共享文件夹实战
  3. 答非所问:产品质量怎样?发现了很多BUG
  4. BAT判断一个目录是否存在
  5. com.jogamp.opengl.GLException: J3D-Renderer-1: createImpl ARB n/a but required, profile > GL2 reques
  6. 疫情严峻,被迫在家办公
  7. undefined reference to symbol 'dlsym@@GLIBC_2.17' libdl.so: error adding symbols: DSO missing from c
  8. 编译OpenJDK12:Could not find any dlls in /cygdrive/c/progra~2/wi3cf2~1/10/Redist/ucrt/DLLs/x64
  9. cve2018 linux内核提权漏洞,CVE-2018-18955:较新Linux内核的提权神洞分析
  10. c语言实现字符串转16进制,C语言实现字符串中(10进制和16进制)转成十进制数(示例代码)...