目录
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密集型任务(网络、数据库等) |