1. asyncio模块用于编写【异步并发】代码,基于async/await语法。适合处理I/O密集型任务(如网络请求、文件读写等),通过事件循环(Event Loop)实现单线程内的并发操作,避免多线程的开销和复杂性。
核心概念:
1)事件循环(Event Loop):asyncio 的核心,负责调度和执行异步任务。
相当于 asyncio 的 “总指挥”。它会循环检查并调度所有待执行的异步任务 —— 比如先启动一个协程,等该协程因 I/O 操作(如等待网络响应)暂停时,立刻切换到其他就绪任务,避免 CPU 空闲,最终实现单线程内的 “并发” 效果。

2)协程(Coroutine):用 async def 定义的函数,可被暂停和恢复。
是异步任务的 “最小执行单元”,用 async def 定义后,它并非直接运行,而是需要被事件循环调度。关键特性是 “可暂停 / 可恢复”—— 遇到 await(等待其他异步操作)时会暂时交出执行权,等等待的操作完成后,再由事件循环唤醒并继续执行后续代码。

3)任务(Task):将协程包装成可调度的对象。
是协程的 “调度包装器”。协程本身无法被事件循环直接调度,需通过 asyncio.create_task() 等方法将其包装成 Task,此时协程才会被注册到事件循环中,进入 “待执行队列”,等待被调度执行。

4)Future:表示异步操作的最终结果
是异步操作的 “结果占位符”。它代表一个尚未完成的异步操作,会在未来某个时间点给出结果(成功或失败)。Task 本质是 Future 的子类,我们通过 await 等待 Future(或 Task),本质就是等待它背后异步操作的最终结果。

备注:“单线程内的并发操作” 核心是在单个 CPU 执行线程中,通过 “高效切换任务” 模拟出 “多个任务同时进行” 的效果,核心逻辑围绕 “任务暂停与恢复” 和 “事件循环调度” 展开,具体解析如下:
1)核心前提:针对 I/O 密集型任务
单线程并发的价值主要体现在 I/O 操作(如网络请求、文件读写、等待数据库响应)场景 —— 这类任务中,线程大部分时间在 “等待外部资源响应”(而非占用 CPU 计算)。此时无需开启多线程,只需在一个线程内,把 “等待时间” 分配给其他任务即可。
2)关键机制:任务暂停与事件循环
●任务暂停:通过async/await语法,让任务在遇到 I/O 等待时主动 “暂停”(释放 CPU),比如await asyncio.sleep(1)会让当前协程暂停 1 秒,此时 CPU 可去执行其他未暂停的任务;
●事件循环(调度核心):单线程内有一个 “事件循环”,负责管理所有任务 —— 它会持续检查任务状态:若 A 任务进入等待,就切换到 B 任务执行;当 A 任务等待结束(如 1 秒到了),事件循环再安排 A 任务恢复执行。
3)与 “并行” 的本质区别
●单线程并发:同一时间只有一个任务在执行(CPU 未被真正 “分身”),只是切换速度极快,肉眼感知不到 “等待”,误以为是 “同时进行”;
●多线程 / 多进程并行:多个任务在不同 CPU 线程 / 进程中真正同时执行(需 CPU 多核支持),适合 CPU 密集型任务(如大量计算)。
4)优势:轻量、无多线程开销
无需处理多线程的 “锁竞争”“内存开销” 等问题,单个线程内的任务切换成本极低(仅需保存 / 恢复任务的上下文状态),因此能高效处理成千上万的并发 I/O 任务(如异步爬虫、异步接口服务)。