2016-11-29 73 views
-1

我在localhost上托管一台服务器,我想异步发送数百个GET请求。为此,我正在使用grequests。一切似乎做工精细,但我多次得到警告:requests + grequests:是否“连接池已满,丢弃连接:”警告有关?

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

一搜索显示如何在requests中创建Session()时避免完整池问题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]) 

回答

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)有没有一种方法来禁用它?

是的,如果你想成为像我这样的doofus,并在源代码中散列出来。我找不到任何其他方式来保持沉默,并且它回来咬我。

SOLUTION

的解决方案是使用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_queries]