Python 异步编程之 async 和 await
基础知识
在 Python 中,async 和 await 是用于异步编程的关键字,引入了异步/协程(coroutine)的概念。核心思想是通过 协程(Coroutine) 和 事件循环(Event Loop) 实现非阻塞并发,避免线程切换的开销。
异步编程是一种处理并发任务的方式,使得程序能够在等待某些 I/O 操作(如文件读写、网络请求等)的同时继续执行其他任务,而不会发生阻塞
- 异步(Asynchronous):在异步编程中,程序不会等待某些I/O操作完成,而是继续执行其他任务,待操作完成后再回来处理结果
- 协程(Coroutine):协程是一种轻量级的线程,可以在执行过程中暂停并让出控制权,然后在需要时恢复执行使用协程可以更有效地利用系统资源,避免线程切换的开销
异步和多线程区别
异步和多线程的区别可参考这篇文章:
一篇文章,搞懂异步和多线程的区别-腾讯云开发者社区-腾讯云
同步示例
import datetime
import timeimport requestsdef result(url):res = request_url(url)def request_url(url):res = requests.get(url)print(url)time.sleep(2)print("execute_time:", datetime.datetime.now() - start_time)return resdef main():url_list = ["https://www.csdn.net/","https://blog.csdn.net/TomorrowAndTuture/article/details/149402464","https://www.baidu.com/",]task = [result(url) for url in url_list]start_time = datetime.datetime.now()
print(f"start_time:{start_time}\n")
main()
end_time = datetime.datetime.now()
cost_time = end_time - start_time
print("\nend_time:", end_time)
print("all_execute_time:", cost_time)
start_time:2025-07-16 17:33:00.905345https://www.csdn.net/
execute_time: 0:00:02.404500
https://blog.csdn.net/qq_43380180/article/details/111573642
execute_time: 0:00:04.839844
https://www.baidu.com/
execute_time: 0:00:07.543495end_time: 2025-07-16 17:33:08.448840
all_execute_time: 0:00:07.543495
异步示例
import asyncio
import datetimeimport requestsasync def result(url):res = await request_url(url)async def request_url(url):res = requests.get(url)print(url)await asyncio.sleep(2)print("execute_time:", datetime.datetime.now() - start_time)return resasync def main():url_list = ["https://www.csdn.net/","https://blog.csdn.net/TomorrowAndTuture/article/details/149402464","https://www.baidu.com/",]task = [asyncio.create_task(result(url)) for url in url_list]await asyncio.gather(*task)start_time = datetime.datetime.now()
print(f"start_time:{start_time}\n")
asyncio.run(main())
end_time = datetime.datetime.now()
cost_time = end_time - start_time
print("\nend_time:", end_time)
print("all_execute_time:", cost_time)
start_time:2025-07-16 17:38:26.561693https://www.csdn.net/
https://blog.csdn.net/qq_43380180/article/details/111573642
https://www.baidu.com/
execute_time: 0:00:03.136231
execute_time: 0:00:03.963955
execute_time: 0:00:04.945443end_time: 2025-07-16 17:38:31.508156
all_execute_time: 0:00:04.946463
asyncio.create_task()
用于并发执行多个协程任务,而 asyncio.gather()
用于等待多个协程任务的全部完成,并且可以收集执行结果。
关键步骤详解
- asyncio.run(coro):启动事件循环并运行协程。
- asyncio.create_task(coro):将协程包装为 Task,加入事件循环并发执行。
- asyncio.gather(*coros):并发执行多个协程,返回结果列表。
- asyncio.sleep(delay):非阻塞等待(模拟 I/O 操作),如果是直接用 time.sleep(delay) 则会产生阻塞等待。
- 使用
async def
定义协程,用await
挂起阻塞操作。 - 通过
asyncio.create_task()
和asyncio.gather()
实现并发。 - 避免在 async def 定义的协程中调用阻塞同步代码(比如 time.sleep(delay))。