当前位置: 首页> 教育> 大学 > Python 在 Asyncio 中运行阻塞任务,避免影响主任务调度

Python 在 Asyncio 中运行阻塞任务,避免影响主任务调度

时间:2025/8/27 7:02:57来源:https://blog.csdn.net/zhouwenjun0820/article/details/141820308 浏览次数:0次

使用FastAPI等异步框架开发接口时,如果接口实现逻辑中有大量阻塞任务,会阻塞loop调度,大大影响服务性能,甚至还不如传统多线程框架(tomcat)!

可以使用asyncio.to_thread包装下阻塞方法,防止阻塞当前调度。

测试:

import asyncio
import time# a blocking io-bound task
def blocking_task():time.sleep(2)print('Blocking task success')return 1# 使用asyncio库来执行异步操作,以模拟一个异步任务的完成过程。
async def async_task():await asyncio.sleep(1)print('Async task success')return 1# main coroutine
async def main():# 先创建并开启阻塞任务block_tasks = [asyncio.create_task(asyncio.to_thread(blocking_task)) for _ in range(100)]# 后创建并开启异步任务async_tasks = [asyncio.create_task(async_task()) for _ in range(100)]# 等待异步任务执行完成await asyncio.gather(*async_tasks)# 等待阻塞任务执行完成rets = await asyncio.gather(*block_tasks)return sum(rets)start_time = time.time()
ret = asyncio.run(main())
print(f'ret:{ret}, time: {time.time() - start_time}')

执行日志:
在这里插入图片描述

可以看到异步任务并没有等待阻塞任务。

参考文档:https://zhuanlan.zhihu.com/p/610881194

关键字:Python 在 Asyncio 中运行阻塞任务,避免影响主任务调度

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: