当前位置: 首页 > news >正文

如何使用asyncio库

asyncio简介

asyncio是Python的标准库,用于编写单线程并发代码,基于协程(coroutines)、事件循环(event loop)和非阻塞I/O操作。它适用于I/O密集型任务(如网络请求、文件读写),而非CPU密集型任务。

核心组件

事件循环(Event Loop)
事件循环是asyncio的核心,负责调度和执行协程任务。通过asyncio.run()或直接管理事件循环对象启动。

协程(Coroutines)
使用async def定义的函数称为协程,可通过await暂停执行,等待其他协程或I/O操作完成。

任务(Tasks)
协程通过asyncio.create_task()包装为任务,由事件循环调度执行。任务可追踪协程状态。

Future对象
低级可等待对象,表示异步操作的最终结果,通常由任务封装。

基本用法

定义协程

import asyncioasync def hello():print("Hello")await asyncio.sleep(1)print("World")

运行协程

asyncio.run(hello())  # Python 3.7+

并发执行任务

async def task_one():await asyncio.sleep(2)return "Task 1 done"async def task_two():await asyncio.sleep(1)return "Task 2 done"async def main():task1 = asyncio.create_task(task_one())task2 = asyncio.create_task(task_two())results = await asyncio.gather(task1, task2)print(results)  # ['Task 1 done', 'Task 2 done']

高级功能

超时控制

async def long_running_task():await asyncio.sleep(10)async def main():try:await asyncio.wait_for(long_running_task(), timeout=5)except asyncio.TimeoutError:print("Task timed out")

队列(Queue)
生产者-消费者模式:

async def producer(queue):for i in range(5):await queue.put(i)await asyncio.sleep(1)async def consumer(queue):while True:item = await queue.get()print(f"Consumed: {item}")queue.task_done()async def main():queue = asyncio.Queue()await asyncio.gather(producer(queue), consumer(queue))

同步原语
如锁(Lock)、信号量(Semaphore):

lock = asyncio.Lock()async def safe_update():async with lock:# 临界区代码pass

常见问题

阻塞代码破坏并发
避免在协程中调用同步阻塞函数(如time.sleep()),需使用asyncio.sleep()loop.run_in_executor()

事件循环策略
在Jupyter等环境中可能需要手动管理事件循环:

import nest_asyncio
nest_asyncio.apply()

适用场景

  • 高并发网络请求(HTTP API、WebSockets)。
  • 异步数据库驱动(如asyncpg、aiomysql)。
  • 微服务间通信。

性能优化

  • 使用uvloop替代默认事件循环(非Windows平台)。
  • 避免频繁创建/销毁任务,复用连接池。

通过合理设计协程和任务调度,asyncio可显著提升I/O密集型应用的吞吐量。

http://www.dtcms.com/a/353995.html

相关文章:

  • 汽车电气系统的发展演进为测试带来了哪些影响?
  • LangChain4J-(3)-模型参数配置
  • AI生成音乐模型发展现状与前景
  • prettier、eslint、stylelint在项目中使用
  • 理解虚拟 DOM:前端开发中的高效渲染利器
  • Linux操作系统——TCP服务端并发模型
  • Java全栈开发面试实战:从基础到复杂场景的深度解析
  • 【51单片机】【protues仿真】基于51单片机点阵屏系统
  • 全域管控,一触可达:复合机器人远程监控方案重塑智能制造
  • Boosting(提升法)详解
  • Spring Boot + Dubbo 实战教程:打造高性能微服务架构
  • 深度学习12 Reinforcement Learning with Human Feedback
  • openwrt ubus 深入分析
  • C# 字符和字符串
  • 怎么解决大模型幻觉问题
  • 【完全二叉树】 P10990 [蓝桥杯 2023 国 Python A] 彩色二叉树|普及+
  • 车辆识别码vin构成
  • python // 和%区别
  • K8S EFK日志收集全流程实战
  • MySQL数据库精研之旅第十二期:探秘视图,数据库中的 “虚拟表” 魔法
  • stm32 hal库spi dma_tx_rx的几个关键函数执行过程jlink trace分析
  • Rust 登堂 之 迭代器Iterator(三)
  • 如何构建灵活、可控、可扩展的多云网络底座
  • 【高级机器学习】1. Hypothesis 与 Objective Function
  • solidworks2024保姆级安装教程及解锁版安装包下载!
  • 【编号478】美国土地利用数据本土、阿拉斯加、夏威夷岛土地利用数据
  • 蛋白质残基 - 残基距离计算:单蛋白工具与批量处理方案
  • 【目标检测】论文阅读5
  • 记录一次内存问题排查
  • 比赛竞猜算法设计思路