php libev pthreads,libuv 与 libev 的对比

news/2024/7/7 19:16:15

05 January 2013

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 下的库。

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

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 的情况


http://lihuaxi.xjx100.cn/news/269846.html

相关文章

跨平台网络游戏趋势和优势

跨平台网络游戏趋势和优势 前几年还是网页游戏蓬勃发展的状态,就有分析指出从明年开始网页游戏市场已经饱和,想想几年前客户端游戏也是同样的窘境,如果将桌面、移动设备、网页统称一个词汇的话,那就是终端,现在各种的终…

计算摄影 | 计算机如何学会自动裁剪图片(自动构图)?

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达1 自动构图基础1.1 什么是构图自动裁剪用摄影的话语来说,就是自动构图。构图来源于绘画,最初指绘画时根据题材和主题思想的要求,把要表…

阿里云蒋江伟:我们致力于为世界提供70%的算力 | 凌云时刻

导读:6月9日,2020阿里云峰会在云端召开,阿里巴巴合伙人、阿里云智能基础产品事业部高级研究员蒋江伟出席峰会并做了题为《新基建,新算力:阿里云基础设施算力全新升级》的重磅发布。(以下内容为演讲实录&…

关于Redis缓存,这3个问题一定要知道!

点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!来源:https://4m.cn/e3JwR最近都没看Redis,现在回来温习下,现在从Redis的三大缓存开始重新探一探有多深有多浅(^▽^)让我来开始知识的醍醐…

第十一周作业关于json

json文件的实例: json文件:{ "name":"王小二", "age":25.2, "birthday":"1990-01-01", "school":"蓝翔", "major(技能)":["理发",&q…

「留光」1小时:中科大让我们离「量子U盘」又近了一步

视学算法报道转载自:机器之心编辑:张倩、小舟「简单来说,我们就是用一块晶体把光『存起来』,一个小时后取出来发现,它的相位、偏振等状态信息还保存得很好。」存储器的功能就是把信息存储起来,直到需要用到…

信息安全系统设计基础期末总结

【博客汇总】 一、每周读书笔记链接汇总 •[第二周读书笔记] http://www.cnblogs.com/20135302wei/p/4842480.html •[第三周读书笔记] http://www.cnblogs.com/20135302wei/p/4858760.html •[第四周读书笔记] http://www.cnblogs.com/20135302wei/p/4870113.html •[第五周读…

php网站安全狗绕过,最新安全狗绕过姿势 - Azeng呐的个人空间 - OSCHINA - 中文开源技术交流社区...

安全狗是让大家最头疼的安全防护软件,然后我给大家带来最新的安全狗绕过,也不知道能活多久。攻防永无止境吧。最新版本安全狗从官网下载的,我来说一下思路。要想绕过安全狗首先你要知道,安全狗是怎么防护的,过滤的是什…