Libuv是个异步运行库,看了官方说明有的地方还是比较迷,直到看了源码才明白。
我觉得应该让人快速上手,然而他连个tcp_send的例子都没有,也没有例子说下生命周期,实际工程可不允许这样哦。。。
能猜个大概其,和自己的想法也差不多,看代码也不会很慢,下面举个tcp客户端的例子快速上手!
主要是看object的生命周期!
一种使用场景:
- 所有调libuv的函数,都应该在uv.loop线程中执行。
- 只有uv_async_send可以安全的在非uv.loop线程调用。
一般可以用async_init预埋一个tcp发送函数
- async_init预埋函数:读取某个队列,有内容就通过uv_write送出
- 用户线程向某队列写,写好async_send通知上述预埋函数,发出去
- 也可以使用async_init预埋tcp关闭函数/连接函数,做故障重连
- 还需要使用async_init预埋loop_close()通知线程退出
- uv_close有个问题,在close_cb中不能delete tcp_t,看源码就清楚啦
生命周期如图
疑问:为什么tcp_t和stream_t一样?
看看源码就知道啦,他们是一个地址被解析成了两种struct,而libuv为了统一文件和tcp的read/write,造了个stream_t结构。
换句话说,图上的stream_t和tcp_t是指向同一个地址的
/* uv_tcp_t is a subclass of uv_stream_t.
* Represents a TCP stream or TCP server. */
struct uv_tcp_s {
UV_HANDLE_FIELDS
UV_STREAM_FIELDS
UV_TCP_PRIVATE_FIELDS
};
/* uv_stream_t is a subclass of uv_handle_t.
* uv_stream is an abstract class.
* uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t. */
struct uv_stream_s {
UV_HANDLE_FIELDS
UV_STREAM_FIELDS
};
规规矩矩先放带水印的图,如果看不清请使用下述无水印图:uv2clear.png