2016-11-29 76 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]