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())

核心区别:

  1. 生态兼容:aiohttp 能无缝跟其他 asyncio 库(比如数据库驱动、Web框架)配合,grequests 跟 gevent 绑死了。
  2. 性能:小规模并发差不多,但高并发场景下 aiohttp 通常更稳定,毕竟是官方钦点的异步方案。
  3. 功能: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

回到顶部