Web

libuv库

Posted by Kerwen Blog on April 23, 2024

libuv是跨平台、轻量级的异步I/O库,由Node.js团队发起和维护。它提供了事件循环、定时器、异步文件和网络操作等功能,使开发者可以方便地处理各种I/O任务。

libuv的主要特点包括:

  • 跨平台:libuv可以在多种操作系统上运行,包括Windows、Linux、macOS等,使得开发者无需考虑操作系统的差异性。

  • 异步模型:libuv基于事件驱动模型实现异步I/O,允许应用程序在处理资源紧张、高并发的客户端请求时,不阻塞主线程,提高可伸缩性和响应速度。

  • 网络编程支持:libuv提供了对TCP/UDP以及TLS/SSL等协议的支持,可以轻松实现网络通信功能。

  • 文件系统支持:libuv支持异步文件操作,包括读取、写入、修改、删除等操作,避免文件操作导致的线程阻塞或死锁问题。

  • 定时器支持:libuv提供定时器功能,允许应用程序在一定时间后执行指定的回调函数。

  • 多线程支持:libuv可以创建多个事件循环对象,每个事件循环对象都有自己的I/O线程池,应用程序可以分配不同的任务给不同的事件循环处理。

一个 async 的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    #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);
    }

Reference

libuv documentation
libuv库简单使用
兄déi,libuv了解一下