Python 异步编程之 async 和 await

基础知识

在 Python 中,async 和 await 是用于异步编程的关键字,引入了异步/协程(coroutine)的概念。核心思想是通过 协程(Coroutine) 和 事件循环(Event Loop) 实现非阻塞并发,避免线程切换的开销。

异步编程是一种处理并发任务的方式,使得程序能够在等待某些 I/O 操作(如文件读写、网络请求等)的同时继续执行其他任务,而不会发生阻塞

  • 异步(Asynchronous):在异步编程中,程序不会等待某些I/O操作完成,而是继续执行其他任务,待操作完成后再回来处理结果
  • 协程(Coroutine):协程是一种轻量级的线程,可以在执行过程中暂停并让出控制权,然后在需要时恢复执行使用协程可以更有效地利用系统资源,避免线程切换的开销

异步和多线程区别

异步和多线程的区别可参考这篇文章:

一篇文章,搞懂异步和多线程的区别-腾讯云开发者社区-腾讯云

同步示例

import datetime
import time

import requests


def 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 res


def 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.905345

https://www.csdn.net/
execute_time: 0:00:02.404500
https://mp.csdn.net/mp_blog/creation/editor/149402464
execute_time: 0:00:04.839844
https://www.baidu.com/
execute_time: 0:00:07.543495

end_time: 2025-07-16 17:33:08.448840
all_execute_time: 0:00:07.543495

异步示例

import asyncio
import datetime

import requests


async 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 res


async 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.561693

https://www.csdn.net/
https://mp.csdn.net/mp_blog/creation/editor/149402464
https://www.baidu.com/
execute_time: 0:00:03.136231
execute_time: 0:00:03.963955
execute_time: 0:00:04.945443

end_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))。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值