libuv异步任务逻辑和uv_queue_work()

本文介绍了libuv中如何利用uv_queue_work处理耗时异步任务,以避免影响eventloop的性能。通过将任务分为耗时逻辑(callback)和后续逻辑(done),并在线程池中执行callback,确保done回调被添加到eventloop中,从而提高系统的吞吐量。uv_queue_work的工作流程包括req的添加、回调触发以及req的自动移除,强调了req与handle在生命周期上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

libuv没有asio的post函数,但我们可以uv_async_init+uv_async_send模拟,uv_async_send传参可以借助 async.data。由于某些任务很耗时(如文件读写,或者连接mysql),如果直接通过上面这种方式添加到eventloop中,会影响eventloop的吞吐量,所以libuv提供了uv_queue_work来解决这种情况。

libuv的异步任务逻辑

这部分其实就是uv_loop_run的延伸,就不逐代码分析了直接上流程图。

在这里插入图片描述

uv_queue_work(loop,callback, done)

libuv提供了线程池。为了解决某些异步任务耗时过长会影响eventloop的吞吐率问题,我们可以将这种任务分成两部分:callback为耗时逻辑 ,done 为执行完callback的后续逻辑。callback交给线程池完成,完成后立刻添加done到eventloop中,然后唤醒eventloop,调用uv_work_done函数,调用done函数。

uv_queue_work 的work req添加和回调触发的详细流程图

在这里插入图片描述
在这我更能体会到req和handle的区别,handle初始化后就一直存在在loop中,我们需要调用close将其从loop中移除,但req则不需要,在添加到线程池工作队列中后,在执行一次后,就会将其从工作队列中移除,done部分也是如此(从loop的wq中移除)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值