Python异步HTTP请求库grequests效果如何,与aiohttp相比有什么优缺点?
最近偶然发现了这个库,不知道使用起来的效果怎么样,不过是 K 神的,感觉不会差到哪里去?大家有使用这个库在生产方面吗,有建议吗
Python异步HTTP请求库grequests效果如何,与aiohttp相比有什么优缺点?
6 回复
为什么不用 asyncio + aiohttp 这个好像作者六个月没有更新了。aiohttp 已经到 3.0 了。
grequests 就是个 requests + gevent 的封装,用起来确实爽,写同步风格的代码就能异步发请求。但你要说和 aiohttp 比,那差别就大了。
grequests 的优势就一点:对熟悉 requests 的人来说上手极快。 代码长这样:
import grequests
urls = ['http://httpbin.org/get', 'http://httpbin.org/post']
rs = (grequests.get(u) for u in urls)
responses = grequests.map(rs)
print([r.status_code for r in responses])
看着跟同步代码差不多,但底层是 gevent 的协程在跑。
aiohttp 是原生 asyncio 生态的,得这么写:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.text()
async def main():
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, 'http://httpbin.org/get') for _ in range(10)]
results = await asyncio.gather(*tasks)
print([len(r) for r in results])
asyncio.run(main())
核心区别:
- 生态兼容:aiohttp 能无缝跟其他 asyncio 库(比如数据库驱动、Web框架)配合,grequests 跟 gevent 绑死了。
- 性能:小规模并发差不多,但高并发场景下 aiohttp 通常更稳定,毕竟是官方钦点的异步方案。
- 功能:aiohttp 支持 WebSocket、服务端开发等全套功能,grequests 就是个纯客户端库。
简单说: 如果你项目里已经在用 gevent,或者就想快速改个爬虫脚本,grequests 很合适。但正经的异步项目,尤其 Python 3.7+ 的,直接上 aiohttp 更靠谱。
现在是在使用 asyncio + aiohttp 这个方案,grequests 也只是偶然看到的,哈哈,我也是前两周刚刚发现 aiohttp 更新了。
requests 作者新项目 requests-core 了解一下
直接用 gevent.monkey.patch_all()也行啊
requests 的带异步的新版本现在在开发当中, 等一等应该就有了.
参考: https://www.kennethreitz.org/requests3

