2016-11-29 4 views
-1

私はlocalhost上にサーバーをホストしています。私は数百のGET要求を非同期的に起動したいと考えています。このため私はgrequestsを使用しています。すべては正常に動作する表示されますが、私は繰り返し警告を得る:リクエスト+ grequests: "接続プールがいっぱいで、接続を破棄しています:"という警告が表示されますか?

WARNING:requests.packages.urllib3.connectionpool:接続プールが満杯になった、廃棄コネクション:date.jsontest.com

Aを検索で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]) 

答えて

0

1)この警告は、実際に何を意味するのでしょうか?私の解釈は、それは が単に発砲からの要求を落としているということですが、それは のように見えません。

これは実際にはまだわかりません。 1つのリクエストを発射しても警告を受け取るには十分でしたが、依然として私に期待される応答を与えるでしょう。

2)この警告は、実際にgrequestsライブラリ に関連していますか? 予期せぬ動作を招き、私のテストで予期した結果が得られませんか?

最後の部分について:はい。私が通信していたサーバは、10個のクエリを同時に処理することができました。次のコードでは、1つのリスト内で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] 
関連する問題