异步的核心是事件循环:遇到 await 时把控制权交回循环,让别的任务继续跑。
最小例子
import asyncio
async def fetch(i):
await asyncio.sleep(1)
return i * i
async def main():
results = await asyncio.gather(*(fetch(i) for i in range(5)))
print(results)
asyncio.run(main())并发抓取
用 aiohttp 并发请求,比同步逐条请求快很多:
import aiohttp, asyncio
async def get(session, url):
async with session.get(url) as r:
return await r.text()
async def main(urls):
async with aiohttp.ClientSession() as s:
return await asyncio.gather(*(get(s, u) for u in urls))注意
不要在协程里调用阻塞函数(如 time.sleep、同步 IO),会卡住整个事件循环;必要时用 asyncio.to_thread 包一层。