私は、Fedora Commons リポジトリで 20,000 個のオブジェクトにデータが存在するかどうかをチェックする必要がある python 2.7 スクリプトに取り組んでいます。基本的にこれは、リポジトリ (Tomcat サーバー上で実行される) 上の 20,000 の異なる URL に 20,000 の HTTP リクエストを送信することを意味します。
私はその仕事をするスクリプトを書きましたが、サーバーのシステム管理者から、ネットワーク接続を開きすぎて問題が発生するという警告を受けました。
私のスクリプトは、これまでのところ urllib2 を使用して HTTP リクエストを作成しています。
response = urllib2.urlopen(url)
response_content = response.read()
実際、このコードは、リクエストごとに 1 つの新しいネットワーク接続を開きます。
他のライブラリを使用してリクエストを作成しようとしましたが、すべてのリクエストに対して同じ接続を再利用する方法が見つかりませんでした。以下の両方のソリューションは、数が実際に少ない場合でも、多くのネットワーク接続を開きます (実際、両方のソリューションは、100 の HTTP 要求に対して 1 つの接続を開くように見えますが、私の場合はまだ約 200 の接続です)。
httplib:
url = "http://localhost:8080/fedora/objects/test:1234?test="
url_infos = urlparse(url)
conn = httplib.HTTPConnection(url_infos.hostname + ":" + str(url_infos.port))
for x in range(0, 20000):
myurl = url + str(x)
conn.request("GET", myurl)
r = conn.getresponse()
response_content = r.read()
print x, "\t", myurl, "\t", r.status
リクエスト:
url = "http://localhost:8080/fedora/objects/test:1234?test="
s = requests.Session()
for x in range(0, 20000):
myurl = url + str(x)
r = s.get(myurl)
response_content = r.content
print x, "\t", myurl, "\t", r.status_code
接続数がはるかに多い場合でも、理想的には、すべてのリクエストに対して 1 つまたはごく少数の接続を使用したいと考えています。それは可能ですか?この数は、システムまたはサーバーに関連する接続ごとの 100 リクエストですか? ちなみに、Apacheサーバーを指すリクエストも作成しようとしましたが、結果は同じでした.