库-libuv 和 libev的对比

From: http://blog.chinaunix.net/uid-28458801-id-4463981.html


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

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

libuv是异步的,libev是同步的多路IO复用。

libev 是系统I/O复用的简单封装,基本上来说,它解决了 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 下的库。

-----------------------------------------------------------------------------------

Q: 博主有没做过两者的benchmark,他们之前的性能对比如何?

A: 当时用 libev 和 libuv 写过一个简单的 HTTP Hello World Server 。具体结果记不清楚了但是可以说性能差距在 5% 以内。

Q:  libuv 在 unix 上应该是用 libev 作为 non-blocking IO 的实现的吧?libuv 中线程池里线程的数量会增加么,是否会有上限?如果上限到了是不是就会出现 block 的情况?

A: 1. libuv 在大概5个月前已经完全不使用 libev 了,参见 commit665a316aa9d551ffdd00d1192d0c3d9c88d7e866 ; 2. libuv 的线程池在BSS上,数量固定为4个,参见:https://github.com/joyent/libuv/blob/master/src/unix/threadpool.c#L28 ; 3. libuv 的线程池共享一个work queue ,所以不会出现 block 的情况



libevent : 名气最大,应用最广泛,历史悠久的跨平台事件库;
libev : 较libevent而言,设计更简练,性能更好,但对Windows支持不够好;
libuv : 开发node的过程中需要一个跨平台的事件库,他们首选了libev,但又要支持Windows,故重新封装了一套,*nix下用libev实现,Windows下用IOCP实现;

libuv 源码git下载


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2016我的程序员总结

作为一个程序员从毕业至今都没有好好写过总结,一是感觉做程序员的履历中没有什么发光点可写,二是因为慵懒。我这个人从小到大都不喜欢写总结,若是以前还好,思维活跃,经常思考问题和人生。可随着年龄增长,反…

【转】C/S,B/S区别

C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。…

wordpress在新窗口打开留言者链接

为什么80%的码农都做不了架构师?>>> 没有什么技术含量可言,网上早有高手支招,但其方法在我现在使用的inove主题下不行,于是自己研究了下代码,完美解决,分享一下: 一般主题都可以这…

vue上传图片加水印;js上传图片添加水印;vue给图片添加水印;canvas图片添加水印;canvas画布导出图片

uni-app微信小程序图片加水印,点击看这篇 需求场景: 要求上传图片,并给图片添加水印。传给后端的也是有水印的图片。 逻辑步骤: 通过input上传图片,拿到图片的信息和base64,将图片绘制到画布上,…

The path is not a valid path to the xx-generic kernel headers

如果在安装 VMware Tools 的过程中弹出该选项,按照以下步骤进行操作: 1. 检查系统内是否已经安装好相应的 kernel headers,比如我的系统: 如果没有该目录的话,那么需要安装以下资源: sudo apt-get instal…

django model Meta选项

可用的 Meta 选项 abstract Options.abstract如果 abstract True ,这个 model 就是一个 抽象基类 。 app_label Options.app_label如果一个 model 定义在默认的 models.py 之外 (例如,如果你的 app 的 models 在 myapp.models 子模块下),你必…

库-libuv:概述

From: http://blog.chinaunix.net/uid-28458801-id-4464173.html libuv 是 Node 的新跨平台抽象层,用于抽象 Windows 的 IOCP 及 Unix 的 libev。作者打算在这个库的包含所有平台的差异性。特性:非阻塞 TCP 套接字非阻塞命名管道UDP定时器子进…

input上传图片;input上传file;vue上传图片。js读取文件的base64;通过File文件读取base64;

本篇是通过File文件来获取base64的;如果需要 通过文件url获取base64看这篇 需求:上传图片并获取base,用的是input file功能上传 注意点:input上传相同文件不触发的原因。需要将inputDOM.value null (不过置空后 29行的打印 就看不…

C#WinForm WebBrowser (二) 实用方法总结

实用方法1:获取状态栏信息 void webBrowser1_StatusTextChanged(object sender, EventArgs e){ label1.Text webBrowser1.StatusText;} 实用方法2:页面跳转后改变地址栏地址//在Navigated事件处理函数中改变地址栏地址是最恰当的:private…

虚拟机找不到/mnt/hgfs挂载目录

如果在安装好 VMware Tools 并在设置里面设定好共享目录之后仍然找不到 /mnt/hgfs 默认挂载目录,那么尝试以下步骤:1. 确认VMware Tools 和共享目录设定已经完成:2. 如果操作结果如上所示,那么表示前提条件准备充足啦,…

pdf上传及预览;file上传pdf文件及预览;vue上传pdf文件及预览;vue-pdf预览pdf文件

需求:上传pdf文件,并点击可以打开预览。使用input的file功能即可完成,预览只需要跳转到pdf的url地址即可。 1.使用iframe直接预览 2.vue-pdf参考 3.vue-pdf报错解决 以下代码可直接复制使用!!!有效的可以点…

Linux termios 串口编程之 VTIME与VMIN

在Linux TTY编程时会涉及到 termios 结构,其中c_cc数组里面,有 VTIME 和 VMIN 下标。关于他们的使用经常令人迷惑,查阅了不少博客,上面的讲解也有不少误区。 在这里重新对这二者关系进行介绍。结合实验会令人记忆更深刻。 VTIME…

ubuntu 12.04解决Broadcom STA无线网卡驱动安装失败解决

ubuntu 12.04解决Broadcom STA无线网卡驱动安装失败解决 首先,打开终端并输入:ls -nn | grep 0280查看网卡的PCI.ID, 我的是:03:00.0 Network controller [0280]: Broadcom Corporation BCM43227 802.11b/g/n [ 14e4:4727] 然后,输…

JS遍历对象或者数组

From: http://keshion.iteye.com/blog/728122 一.纯js实现 Js代码 <script> var obj {"player_id":"GS001","event_id":"1","destroy":"97%"}; var props ""; for(var p in obj){…

深入了解SEO

为什么要SEO&#xff0c;SEO的作用是什么&#xff1f;SEO&#xff08;Search Engine Optimization&#xff09;是为了让自己的IT产品优先能被搜索引擎找到&#xff0c;通过搜索引擎搜索推荐给网民浏览&#xff08;特点就是精准找到用户群体&#xff09;。正所谓&#xff0c;有用…

el-table表格fixed=“right“后表格错乱;Safari浏览器el-table表格错乱;Safari浏览器样式需改无效;

场景&#xff1a;el-table表格操作列右固定fixed“right”&#xff0c;导致表格错乱。其实是由于某行的字体太多&#xff0c;所导致操作列高度错乱。 至于Safari浏览器样式修改无效的问题&#xff1a;每次修改代码后&#xff0c;Safari浏览器项目刷新无变化&#xff0c;必须每次…

从零开始学习Node.js例子七 发送HTTP客户端请求并显示响应结果

From: http://www.cnblogs.com/EricaMIN1987_IT/p/3654233.html wget.js&#xff1a;发送HTTP客户端请求并显示响应的各种结果 options对象描述了将要发出的请求。 data事件在数据到达时被触发&#xff0c;error事件在发生错误时被触发。 HTTP请求中的数据格式通过MIME协议来声…

2---多线程文件读写

//最简单的创建多线程实例 #include <stdio.h> #include <windows.h> //子线程函数 1 DWORD WINAPI ThreadFun1(LPVOID pM) { while (1) { printf("子线程的线程1 "); return 0; } } //子线程函数 2 int i0;DWORD WINAPI ThreadFun2…

el-select 结合 el-checkBox 实现下拉全选+多选功能;el-select下拉框全选功能;

原文链接 el-select选择框也有多选功能&#xff0c;但是没有全选。故需要改造一下&#xff0c;el-select 结合 el-checkBox 实现下拉全选多选功能。 代码如下&#xff0c;可直接复制使用&#xff1a; <!--* Description: el-select 结合 el-checkBox 实现下拉全选多选功能 …

TCPDUMP/LIBPCAP 3-PCAP 中文手册(1)

SYNOPSIS #include <pcap/pcap.h> DESCRIPTION PCAP提供为抓包系统提供高级接口。网络上的所有数据包&#xff0c;即使是发往其他主机的数据包&#xff0c;都可以通过这种机制访问。它还支持将捕获的数据包保存到“savefile”&#xff0c;和从“savefile”中读取数据包…