5

ボックスにWebサービスをデプロイしています。このサービスの結果をいろいろな入力で確認したい。これが私が使用しているコードです:

import sys
import httplib
import urllib

apUrl = "someUrl:somePort"

fileName = sys.argv[1]
conn = httplib.HTTPConnection(apUrl)

titlesFile = open(fileName, 'r')

try:
    for title in titlesFile:

        title = title.strip()
        params = urllib.urlencode({'search': 'abcd', 'text': title})
        conn.request("POST", "/somePath/", params)
        response = conn.getresponse()
        data = response.read().strip()
        print data+"\t"+title

        conn.close()

finally:
    titlesFile.close()

このコードは、同じ行数が印刷された後にエラーを出します(28233)。エラーメッセージ:

Traceback (most recent call last):
  File "testService.py", line 19, in ?
    conn.request("POST", "/somePath/", params)
  File "/usr/lib/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib/python2.4/httplib.py", line 636, in connect
    raise socket.error, msg
socket.error: (99, 'Cannot assign requested address')

Python2.4.3を使用しています。私conn.close()もやっています。しかし、なぜこのエラーが発生するのですか?

4

3 に答える 3

12

これはPythonの問題ではありません。

Linuxカーネル2.4では、エフェメラルポートの範囲は32768〜61000です。したがって、使用可能なポートの数= 61000〜32768 + 1 =28233です。問題のWebサービスは非常に高速(実際には<5ms)であるため、すべてポートが使い果たされます。プログラムは、ポートが閉じるまで約1〜2分待つ必要があります。

私がしたことは、の数を数えることでしたconn.close()。番号が28000になったら、90秒待ってからカウンターをリセットします。

于 2012-06-26T13:58:06.610 に答える
6

BIGYaNは問題を正しく識別し、例外が発生した直後に「netstat-tn」を呼び出すことでそれを確認できます。状態が「TIME_WAIT」の非常に多くの接続が表示されます。

ポート番号が再び使用可能になるのを待つ代わりに、すべての要求に対して1つの接続を使用するだけです。conn.close()の各呼び出しの後に呼び出す必要はありませんconn.request()。リクエストが完了するまで、接続を開いたままにしておくことができます。

于 2013-01-04T15:34:25.173 に答える
1

SparkでPythonのリクエストライブラリを使用して複数のPOSTステートメントを実行しているときに、私も同様の問題に直面しました。さらに悪いことに、サーバーに投稿するために各エグゼキューターに対してマルチプロセッシングを使用しました。したがって、数千の接続が数秒で作成され、それぞれがTIME_WAITから状態を変更し、次の接続セットのためにポートを解放するのに数秒かかりました。

request.Session()などを使用して、キープアライブを無効にすることについて話しているインターネット上で利用可能なすべてのソリューションの中で、ヘッダーパラメーターとして「Connection」:「close」構成を使用するこの回答が機能していることがわかりました。 。ただし、postコマンドの外側の別の行にヘッダーコンテンツを配置する必要がある場合があります。

headers = {
        'Connection': 'close'
}
with requests.Session() as session:
response = session.post('https://xx.xxx.xxx.x/xxxxxx/x', headers=headers, files=files, verify=False)
results = response.json()
print results

これは、上記の解決策を使用した同様の問題に対する私の答えです。

于 2018-04-09T15:16:12.720 に答える