requests + grequests:"Connection pool is full, discarding connection:" 警告是否相关?
requests + grequests: is the "Connection pool is full, discarding connection:" warning relevant?
我在 localhost 上托管服务器,我想异步触发数百个 GET 请求。为此,我使用 grequests
。一切 似乎 工作正常,但我反复收到警告:
WARNING:requests.packages.urllib3.connectionpool:Connection pool is full, discarding connection: date.jsontest.com
搜索显示在 requests
中创建 Session()
时如何避免池满问题,例如here。但是,有几件事:
- 即使我不采取任何措施来避免警告,我似乎始终如一地获得预期的结果。如果我确实使用了解决方法,任何超过
pool_maxsize
数量的请求都会发出警告。
- 如果请求数超过池大小,链接的解决方法仍会导致警告。我假设会有某种限制来防止在任何时候超过池大小
- 我似乎找不到禁用警告的方法。
requests.packages.urllib3.disable_warnings()
好像什么都没做。
所以我的问题是:
- 这个警告到底是什么意思?我的解释是它只是放弃了触发请求,但似乎并非如此。
- 这个警告实际上与
grequests
库相关吗,尤其是当我采取措施限制池大小时?我是否在邀请意想不到的行为并在我的测试中侥幸获得我的预期结果?
- 有没有办法禁用它?
一些要测试的代码:
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])
1) What does this warning actually mean? My interpretation is that it
is simply dropping the requests from firing, but it doesn't seem to be
the case.
这个我其实还不清楚。即使发出一个请求也足以收到警告,但仍会给我预期的响应。
2) Is this warning actually relevant for the grequests library,
especially when I take steps to limit the pool size? Am I inviting
unexpected behaviour and fluking my expected result in my tests?
最后一部分:是。我与之通信的服务器可以同时处理 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) Is there a way to disable it?
是的,如果你想成为像我一样的傻瓜并在源代码中散列它。我找不到任何其他方法让它安静下来,它又回来咬我。
解决方案
解决方案是轻松过渡到使用 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]
我在 localhost 上托管服务器,我想异步触发数百个 GET 请求。为此,我使用 grequests
。一切 似乎 工作正常,但我反复收到警告:
WARNING:requests.packages.urllib3.connectionpool:Connection pool is full, discarding connection: date.jsontest.com
搜索显示在 requests
中创建 Session()
时如何避免池满问题,例如here。但是,有几件事:
- 即使我不采取任何措施来避免警告,我似乎始终如一地获得预期的结果。如果我确实使用了解决方法,任何超过
pool_maxsize
数量的请求都会发出警告。 - 如果请求数超过池大小,链接的解决方法仍会导致警告。我假设会有某种限制来防止在任何时候超过池大小
- 我似乎找不到禁用警告的方法。
requests.packages.urllib3.disable_warnings()
好像什么都没做。
所以我的问题是:
- 这个警告到底是什么意思?我的解释是它只是放弃了触发请求,但似乎并非如此。
- 这个警告实际上与
grequests
库相关吗,尤其是当我采取措施限制池大小时?我是否在邀请意想不到的行为并在我的测试中侥幸获得我的预期结果? - 有没有办法禁用它?
一些要测试的代码:
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])
1) What does this warning actually mean? My interpretation is that it is simply dropping the requests from firing, but it doesn't seem to be the case.
这个我其实还不清楚。即使发出一个请求也足以收到警告,但仍会给我预期的响应。
2) Is this warning actually relevant for the grequests library, especially when I take steps to limit the pool size? Am I inviting unexpected behaviour and fluking my expected result in my tests?
最后一部分:是。我与之通信的服务器可以同时处理 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) Is there a way to disable it?
是的,如果你想成为像我一样的傻瓜并在源代码中散列它。我找不到任何其他方法让它安静下来,它又回来咬我。
解决方案
解决方案是轻松过渡到使用 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]