GRequests: 异步请求
GRequests 允许您使用 Gevent 与 Requests 结合,轻松实现异步 HTTP 请求。
|版本| |Python版本|
安装
使用 pip 安装非常简单:
$ pip install grequests
✨🍰✨
使用方法
使用方法很简单:
.. code-block:: python
import grequests
urls = [
'http://www.heroku.com',
'http://python-tablib.org',
'http://httpbin.org',
'http://python-requests.org',
'http://fakedomain/',
'http://kennethreitz.com'
]
创建一组未发送的请求:
.. code-block:: python
>>> rs = (grequests.get(u) for u in urls)
使用 map
同时发送所有请求:
.. code-block:: python
>>> grequests.map(rs)
[<Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>, None, <Response [200]>]
grequests
中的 HTTP 动词方法(如 grequests.get
、grequests.post
等)接受与 requests
库相同的所有关键字参数。
错误处理 ^^^^^^^^^^^^^^
要处理请求连接过程中的超时或任何其他异常,您可以添加一个可选的异常处理程序,它将在主线程中被调用,并传入请求和异常。异常处理程序返回的值将被用作 map
返回的结果列表中的项。
.. code-block:: python
>>> def exception_handler(request, exception):
... print("请求失败")
>>> reqs = [
... grequests.get('http://httpbin.org/delay/1', timeout=0.001),
... grequests.get('http://fakedomain/'),
... grequests.get('http://httpbin.org/status/500')]
>>> grequests.map(reqs, exception_handler=exception_handler)
请求失败
请求失败
[None, None, <Response [500]>]
imap ^^^^
为了获得一些速度/性能提升,您可能还想使用 imap
而不是 map
。imap
返回一个响应生成器。这些响应的顺序与您发送请求的顺序不对应。imap
的 API 与 map
的 API 相同。您还可以调整 map
或 imap
的 size
参数来增加 gevent 池的大小。
.. code-block:: python
for resp in grequests.imap(reqs, size=10):
print(resp)
还有一个 imap
的枚举版本,称为 imap_enumerated
,它会产生原始请求列表中请求的索引及其关联的响应。然而,与 imap
不同,失败的请求和返回 None
的异常处理程序结果也会被产生(而在 imap
中它们会被忽略)。此外,imap_enumerated
的 requests
参数必须是一个序列。与 imap
一样,发送和接收请求的顺序仍应被视为任意的。
.. code-block:: python
>>> rs = [grequests.get(f'https://httpbin.org/status/{code}') for code in range(200, 206)]
>>> for index, response in grequests.imap_enumerated(rs, size=5):
... print(index, response)
1 <Response [201]>
0 <Response [200]>
4 <Response [204]>
2 <Response [202]>
5 <Response [205]>
3 <Response [203]>
gevent - 当出现问题时 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
由于 grequests
利用了 gevent
(而后者又使用猴子补丁来实现并发),您通常需要确保在导入其他库之前导入 grequests
,特别是 requests
,以避免问题。有关更多信息,请参阅 grequests gevent 问题。
.. code-block:: python
# 正确
import grequests
import requests
# 错误
import requests
import grequests
.. |版本| image:: https://img.shields.io/pypi/v/grequests.svg?colorB=blue :target: https://pypi.org/project/grequests/
.. |Python版本| image:: https://img.shields.io/pypi/pyversions/grequests.svg? :target: https://pypi.org/project/grequests/