基礎知識
在 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))。