libuv库简单使用
libuv是跨平台、轻量级的异步I/O库,由Node.js团队发起和维护。它提供了事件循环、定时器、异步文件和网络操作等功能,使开发者可以方便地处理各种I/O任务。
libuv提供了一套强大而易用的异步I/O编程接口,在网络编程、文件系统操作、定时器等方面具有广泛的应用场景。由于其开源、跨平台、高效、稳定等优点,被越来越多的开发者采用并集成在自己的项目中。
无论是在Node.js还是其他项目中,libuv都负责处理底层的事件循环和I/O操作,使开发者能够编写高效且非阻塞的代码。它在不同的操作系统上使用不同的后端实现,如epoll、kqueue、IOCP等,以便充分利用各个平台的特性和性能。
"uv" 是指"Unicorn Velociraptor"的缩写。"Unicorn Velociraptor"是libuv的创始人 Bert Belder 的幽默取名,没有特殊的技术含义。
libuv的主要特点包括:
-
跨平台:libuv可以在多种操作系统上运行,包括Windows、Linux、macOS等,使得开发者无需考虑操作系统的差异性。
-
异步模型:libuv基于事件驱动模型实现异步I/O,允许应用程序在处理资源紧张、高并发的客户端请求时,不阻塞主线程,提高可伸缩性和响应速度。
-
网络编程支持:libuv提供了对TCP/UDP以及TLS/SSL等协议的支持,可以轻松实现网络通信功能。
-
文件系统支持:libuv支持异步文件操作,包括读取、写入、修改、删除等操作,避免文件操作导致的线程阻塞或死锁问题。
-
定时器支持:libuv提供定时器功能,允许应用程序在一定时间后执行指定的回调函数。
-
多线程支持:libuv可以创建多个事件循环对象,每个事件循环对象都有自己的I/O线程池,应用程序可以分配不同的任务给不同的事件循环处理。
放一个 async 的简单例子:
#include <stdio.h> #include <uv.h> // 声明回调函数 void asyncCallback(uv_async_t* handle); void close_cb(); // 定义全局的事件循环对象 uv_loop_t *loop; // 定义异步处理器结构体 uv_async_t async; int main() { // 创建事件循环 loop = uv_default_loop(); // 初始化异步处理器 uv_async_init(loop, &async, asyncCallback); // 发送异步事件 uv_async_send(&async); // 启动事件循环 uv_run(loop, UV_RUN_DEFAULT); // 清理并关闭事件循环 uv_loop_close(loop); return 0; } // 实现回调函数 void asyncCallback(uv_async_t* handle) { printf("asyncCallback\n"); fflush(stdout); uv_close((uv_handle_t*)&async, close_cb); //如果async没有关闭,消息队列是会阻塞的 } void close_cb() { printf("close_cb\n"); fflush(stdout); }
注:回调函数有形参 “uv_async_t* handle” 时,需要在函数末尾加入 uv_close() 函数,关闭句柄,防止阻塞。
运行结果: