1

我在 localhost 上托管一个服务器,我想异步触发数百个 GET 请求。为此,我正在使用grequests. 一切似乎都很好,但我反复收到警告:

警告:requests.packages.urllib3.connectionpool:连接池已满,丢弃连接:date.jsontest.com

Session()搜索显示了在创建requests例如here时如何避免完整池问题。但是,有几件事:

  1. 即使我不采取任何措施来避免警告,我似乎始终能得到预期的结果。如果我确实使用了解决方法,任何超过数量的请求pool_maxsize都会发出警告。
  2. 如果请求数超过池大小,链接的解决方法仍会导致警告。我认为会有某种节流来防止在任何时候超过池大小
  3. 我似乎找不到禁用警告的方法。requests.packages.urllib3.disable_warnings()似乎什么也没做。

所以我的问题是:

  1. 这个警告实际上是什么意思?我的解释是,它只是放弃了触发请求,但似乎并非如此。
  2. 这个警告是否真的与grequests图书馆相关,特别是当我采取措施限制池大小时?我是否会在我的测试中引发意外的行为并侥幸获得预期的结果?
  3. 有没有办法禁用它?

一些要测试的代码:

import grequests
import requests

requests.packages.urllib3.disable_warnings() # Doesn't seem to work?

session = requests.Session()

# Hashing the below will cause 105 warnings instead of 5
adapter = requests.adapters.HTTPAdapter(pool_connections=100, 
                                            pool_maxsize=100)
session.mount('http://', adapter)

# Test query
query_list = ['http://date.jsontest.com/' for x in xrange(105)]

rs = [grequests.get(item, session=session) for item in query_list]
responses = grequests.map(rs)
print len([item.json() for item in responses])
4

1 回答 1

0

1)这个警告实际上是什么意思?我的解释是,它只是放弃了触发请求,但似乎并非如此。

这对我来说实际上仍然不清楚。即使发出一个请求也足以得到警告,但仍然会给我预期的响应。

2) 这个警告是否真的与 grequests 库相关,尤其是当我采取措施限制池大小时?我是否会在我的测试中引发意外的行为并侥幸获得预期的结果?

最后一部分:的。我与之通信的服务器可以同时处理 10 个查询。使用以下代码,我可以在单个列表理解中发送 400 个左右的请求,并且一切正常(即我的服务器从未被淹没,因此它一定在某种程度上受到了限制)。在请求数量达到某个临界点后,代码将停止触发任何请求,并简单地给出一个None. 它甚至没有尝试通过列表,它甚至没有触发第一个查询,它只是阻塞了。

sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=10, 
                                            pool_maxsize=10)
sess.mount('http://', adapter)  

# Launching ~500 or more requests will suddenly cause this to fail
rs = [grequests.get(item[0], session=session) for item in queries]
responses = grequests.map(rs)

3)有没有办法禁用它?

是的,如果您想成为像我一样的傻瓜并在源代码中对其进行散列。我找不到任何其他方法让它安静下来,它又回来咬我。

解决方案

解决方案是轻松过渡到使用requests-futures。以下代码的行为完全符合预期,没有发出任何警告,并且到目前为止,可以扩展到我向它抛出的任意数量的查询。

from requests_futures.sessions import FuturesSession

session = FuturesSession(max_workers = 10)
fire_requests = [session.get(url) for url in queries]
responses = [item.result() for item in fire_requests]
于 2016-12-04T16:36:24.297 回答