使用libevent的代码有未查明的内存泄漏,转而使用libuv。libuv是提供给node.js使用的事件库,维护效率更快,社区氛围更为活跃。刚决定采用libuv,github上昨天(12月13日)又出了个修正bug的stable新版本,让人安心。
安装
- ubuntu使用aptitude没找到libuv的包,只好直接在github上git clone ,转到稳定release分支。或者直接用wget下载最新release压缩包。
-
按github上libuv的说明开始编译,默认编译出来是根据本机cpu类型的64位static lib,debug版。但我需要的是32位release。看了下gyp_uv.py的内容,在执行此文件时加上-Dtarget_arch=ia32。执行后查看out/Makefile, 在make时添上BUILDTYPE=Release,编译32位release成功。 即
-
了解下gyp应该可以更方便修改编译选项
使用
错误处理
- 教程与实际应用的区别就是,教程从来不做错误处理。实际使用libuv,还是需要自己编码上手,从debug与实际运行结果来学习使用,进一步可以看源码。
- libuv的错误信息使用自建的
uv_err_t
类型,可用uv_last_error()
获取,接着使用uv_strerror()
查看错误码对应的字符串信息 - libuv的大部分函数返回值为0时表示成功, -1则表示失败;回调函数的参数status也一样。
一些注意点
- libuv的handle或req都带有一个
void* data
变量,用来存放使用用户数据。尽量避免类似云风所诟病的那种按结构偏移来存放使用用户数据 - libuv是非线程安全的,要跨线程对loop所在线程进行操作,需要使用
uv_async_send
- libuv的timer没有类似libevent里
active_event
即时事件生效的函数, 不过如果timer不需要repeat, 可以在uv_time_start()
的repeat参数设置一个小的非零值,然后使用uv_timer_again()
,效果相当于即时生效了。 - uv_tcp_t连接失败的话,重新连接需要再次调用
uv_tcp_init()
一次,原因不明 - uv_read_cb回调错误是EOF的话,表示uv_tcp_t已经断开连接,此时设定重连。uv_tcp_t断开连接后不会再调用uv_connect_cb似乎
未完待续