异步的核心是事件循环:遇到 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 包一层。

<