首页 > 其他分享 >libuv库简单使用

libuv库简单使用

时间:2023-10-10 19:56:14浏览次数:38  
标签:异步 简单 uv 使用 close async libuv loop

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的主要特点包括:

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

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

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

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

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

  6. 多线程支持: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() 函数,关闭句柄,防止阻塞。

 

运行结果:

 

标签:异步,简单,uv,使用,close,async,libuv,loop
From: https://www.cnblogs.com/y-z-h/p/17755561.html

相关文章

  • Monkey adb命令使用详解
    Monkey通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,Monkey主要用于Android的压力测试 自动的一个压力测试小工具, 主要目的就是为了测试app 是否会Crash缺点:不支持条件判断,也不支持读取待测界面......
  • springboot整合mybatis中使用分页插件 getTotal为0的原因(本人出现的问题)
      本人将实现分页插件---pagehelper.startpage()放到 ---page<Employee>这条语句的前面就获得到了total的值 ......
  • Git的安装与使用
    Git的安装与使用Git是一个免费开源的分布式版本控制系统,系统设计的目的是快速和高效地处理从小型到大型项目的所有内容下载官方下载网址:https://git-scm.com/downloads阿里云镜像站下载网址:https://registry.npmmirror.com/binary.html?path=git-for-windows/Standalone......
  • 关于使用不同币种付款核销,在应付选择异币种核销
    1.在应付账款中,我们原来发票是美元,但我们实际付款为欧元,这里前是是已经做发票情况下。在做应付单时使用欧元做付款单2.在保存审核核销时我们可以选择异币种核销进行处理,系统会自动生成凭证及调汇凭证 ......
  • 在ts时使用axios请求类型定义增加属性
    1.需求在后台请求中有一些请求数据量比较大无法一下返回,需要增加loading动画,为了方便控制想在请求的时候增加一个参数isLoading,默认关闭,传真值时开启动画。这便需要拓展axios中增加个性化参数配置。但是如何进行类型的定义呢?2.操作 如上,在做左边增加了isLoading参数,代码......
  • .net core linux下使用SkiaSharp实现图形验证码
    linux下使用c#自带的获取验证码需要安装图形处理插件比较麻烦 安装nugit依赖SkiaSharp.NativeAssets.Linux.NoDependencies  添加helper类SkiaSharpValidateCodeHelper.csusingSkiaSharp;usingSystem.Text;namespaceVerifyCode.Helpers{publicclassSkia......
  • tar命令的基础使用(笔记)
    tar命令的基础使用tar[选项][文件]基本操作exam:tar-cfarchive.tarfoobar#归档tar-tvfarchive.tar#列出归档tar-xfarchive.tar#解包选项作用-c创建-t列出归档内容-f指定文件-x从归档中解出文件-v显示更多......
  • vue实现简单的页面框架
    效果图:代码结构:......
  • 关于Winform中使用DataGridView显示数据时,CheckBox选中状态异常问题
    使用C#创建的Winfrom项目,使用DataGridView显示数据,第一列中使用了DataGridViewCheckBoxColumn实现复选功能。但是当我绑定好数据后测试时,发现勾选和取消勾选的操作表现完全不按照预想的来——连续勾选几行后取消其中部分行的选中状态,再重复选中和取消时,原本不该被选中的checkBox......
  • Day17 装饰介绍_装饰器的视线思路_语法糖的使用_装饰器模版_时间装饰器_登录装饰器
    1.储备知识_args_kwargs_名称空间作用域_函数对象: 2.储备知识_函数的嵌套定义_闭包函数: 3.储备知识_传参的方式一_传参的方式二: 4.装饰器的介绍: 5.装饰器实现思路,解决方案一: 6.装饰器实现思路,解决方案二: 7.装饰器实现思路,解决方案三: 8.装饰器实现思路,解决方......