1、综述
libuv是一个高性能的,事件驱动的I/O库,支持跨平台(由平台决定使用libev或IOCP),诞生自node.js。libev是网络库libevent的改进版,但libev在Windows下的性能不太好(使用select模型),而libuv则封装了Windows上的IOCP,性能更高,所以后来node.js使用libuv替换了libev。除了node.js以外,Rust编程语言也使用libuv。
libuv使用异步的,事件驱动的编程风格,其核心工作是提供一个event-loop,以及基于I/O等其它事件的回调通知。异步事件驱动指的是我们可以提前注册感兴趣的事件,比如读取数据,然后在数据到来可读的时候得到通知。
libuv还提供了一些核心工具,如非阻塞网络支持,异步文件系统访问,定时器,子进程等。
2、简单示例
如下为开启一个loop的简单示例:
#include "uv.h" int main() { uv_loop_t* loop = (uv_loop_t*)malloc(sizeof(uv_loop_t)); //loop类型的handle uv_loop_init(loop); //初始化loop uv_run(loop, UV_RUN_DEFAULT); //启动event-loop,因为没有注册任何要监听的事件,所以会直接退出 uv_loop_close(loop); //关闭loop,回收内存 uv_fs_t t; free(loop); }
handle代表了持久性对象,相应的handle上有许多与之关联的request,如uv_loop_t、uv_idle_t、uv_tcp_t。request是短暂性对象(通常只维持在一个回调函数的时间),通常对映着handle上的一个I/O操作,用来传递上下文,如uv_fs_t、uv_req_t、uv_connect_t。handle和request都有一个void*类型的data域,可以用来存储自定义的上下文信息。
下面是一个使用空转handle(uv_idle_t)的例子,当达到1000的计数后,关闭空转监视器,当找不到活着的事件监视器后,uv_run()也会退出:
#include "uv.h" int64_t counter = 0; void wait_for_a_while(uv_idle_t* handle) { counter++; if (counter >= 1000) { uv_idle_stop(handle); printf("stop Idling\n"); } } int main() { uv_idle_t idler; //空转handle uv_loop_t* loop = uv_default_loop(); //使用libuv提供的默认loop uv_idle_init(loop, &idler); uv_idle_start(&idler, wait_for_a_while); printf("Idling start\n"); uv_run(loop, UV_RUN_DEFAULT); uv_loop_close(loop); printf("Idling end\n"); }
标签:handle,uv,libev,idle,概述,libuv,loop From: https://www.cnblogs.com/milanleon/p/18163117