2

Python 2.4.4 ではurllib2.urlopen()、リソースを要求するために使用しています。リクエストを行う前に、次のようにタイムアウトを設定しています。

socket.setdefaulttimeout(10)

(このバージョンの Python は古すぎて、urlopen()ビルトイン タイムアウト付きのバージョンはありません。)

ほとんどの場合、これでうまくいくようです。ただし、要求に応じてハングするサーバーに遭遇しました。Chrome では、ブラウザがあきらめて次のように言うまでに 5 分近くかかります。

SERVERNAME の応答に時間がかかりすぎたため、Google Chrome はウェブページを読み込めませんでした。Web サイトがダウンしているか、インターネット接続に問題が発生している可能性があります。

Python では、urlopen短いタイムアウトを設定しているにもかかわらず、リクエストが無期限にハングしているように見えます。正確には何がsocket.setdefaulttimeout()制御され、これらの接続にハードタイムアウトを強制する方法はありますか (他に何が起こっているかに関係なく、10 秒が経過すると、試行を終了します)?

4

1 に答える 1

0
def _reset_timeout(self, timeout=None):
    socket.setdefaulttimeout(timeout)

def _set_timeout(self, timeout=None):
    if timeout:
        socket.setdefaulttimeout(timeout)



default_timeout = socket.getdefaulttimeout()
try:
    self._set_timeout(timeout)
    req = urllib2.Request(url)
    response = urllib2.urlopen(request)

finally:
    self._reset_timeout(default_timeout)

ソケットには独自のタイムアウトがあります。リクエストごとに、必要なタイムアウトを設定してから、タイムアウトをリセットします(失敗を含むすべての場合)

場合によっては、サーバーが応答せず、タイムアウトが設定した時間より長くなることがあります。

上記のコードでは、デフォルトのタイムアウト (それが何であれ) を取得しており、リクエストに対して、それを必要な値に設定してから、何も変更しないように元の値にリセットしています。

于 2012-07-12T18:37:31.217 に答える