libuv 快速上手

@vrqq  February 12, 2020

Libuv是个异步运行库,看了官方说明有的地方还是比较迷,直到看了源码才明白。
我觉得应该让人快速上手,然而他连个tcp_send的例子都没有,也没有例子说下生命周期,实际工程可不允许这样哦。。。
能猜个大概其,和自己的想法也差不多,看代码也不会很慢,下面举个tcp客户端的例子快速上手!
主要是看object的生命周期!

一种使用场景:
uv0.png

  • 所有调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,看源码就清楚啦

生命周期如图
ev2.png

疑问:为什么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


添加新评论