目錄
python 協程 通俗理解
Python 的 asyncio 協程,最擅長的是:
批量下載文件的例子:
協程的優勢:
python 協程 通俗理解
def my_coroutine():print("開始")x = yield 1print("拿到了:", x)yield 2co = my_coroutine()
print(next(co)) # 輸出:開始 -> 1
print(co.send(99)) # 輸出:拿到了:99 -> 2
開始
1
拿到了:99
2
這說明我們可以把“外部值”傳進函數中間,并讓它繼續從“上次停下的地方”執行。
Python 的 asyncio
協程,最擅長的是:
適合的 I/O 類型 | 舉例 |
---|---|
網絡 I/O | 請求網頁、數據庫、接口 |
Socket I/O | 聊天服務器、RPC、推送 |
異步文件操作(需特殊庫) |
|
批量下載文件的例子:
import asyncio
import aiohttp
import timeasync def fetch(session, url):print(f"開始下載 {url}")async with session.get(url) as response:text = await response.text()print(f"{url} 下載完畢,長度:{len(text)}")async def main():urls = ['https://www.example.com'] * 5async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]await asyncio.gather(*tasks)start = time.time()
asyncio.run(main())
print("耗時:", time.time() - start)
協程的優勢:
對比項 | 多線程 | 協程 |
---|---|---|
內存開銷 | 較高(每個線程有棧空間) | 極低(協程本質是狀態機) |
上下文切換 | 操作系統級別,重 | 用戶態,輕 |
啟動成本 | 高 | 低 |
并發數量 | 受線程數限制(數百) | 可成千上萬個協程 |
異常處理 | 分散,不好控 | 更集中統一 |
適合場景 | CPU密集型任務 | I/O密集型任務(網絡、數據庫等) |