1

さまざまなサーバーから Web ページを取得する小さなサービスを実装しています。さまざまな種類のタイムアウトを構成できる必要があります。私はsettimeoutソケットの方法をいじってみましたが、それは私が望んでいるものではありません。ここに問題があります。

  1. 最初の DNS ルックアップのタイムアウトを指定する必要があります。これは、最初にインスタンス化するときに行われることを理解していますHTTPConnection

  2. 私のコードは、最初.readにデータのチャンク (約 10 MB) を作成し、ペイロード全体がこれに収まる場合は、コードの他の部分に進むように記述されています。これに収まらない場合は、ペイロードをメモリではなくファイルに直接ストリーミングします。これが発生すると、データを取得するために unbounded.read()を実行し、リモート側がたとえば毎秒 1 バイトのデータを送信すると、接続は毎秒 1 バイトの受信を待機し続けます。「時間がかかりすぎです」と切断できるようにしたい。スレッドベースのソリューションは最後の手段です。

4

2 に答える 2

1

リクエストを試しましたか?

タイムアウトを便利に設定できますhttp://docs.python-requests.org/en/latest/user/quickstart/#timeouts

>>> requests.get('http://github.com', timeout=0.001)

編集:私は質問のパート2を逃しました。そのためにあなたはこれを使うことができます:

import sys
import signal
import requests

class TimeoutException(Exception): 
    pass 

def get_timeout(url, dns_timeout=10, load_timeout=60):
    def timeout_handler(signum, frame):
        raise TimeoutException()

    signal.signal(signal.SIGALRM, timeout_handler) 
    signal.alarm(load_timeout)  # triger alarm in seconds

    try: 
        response = requests.get(url, timeout=dns_timeout)
    except TimeoutException:
        return "you're taking too long"
    return response

コードでget_timeout関数を使用します。

他の関数でタイムアウトを使用できるようにする必要がある場合は、デコレータを作成できます。上記のコードはhttp://pguides.net/python-tutorial/python-timeout-a-function/からのものです。

于 2012-05-01T12:05:59.107 に答える
1

httplibあなたが探しているものにまっすぐ進むことです。

http://pycurl.sourceforge.net/http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTTIMEOUTオプションを確認することをお勧めします。

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPT_NOSIGNALオプションも興味深いようです。

c-ares をサポートする libcurl をビルドして、非同期 DNS ルックアップを有効にすることを検討してください。これにより、信号なしで名前解決の適切なタイムアウトが可能になります。

于 2012-04-26T07:06:28.730 に答える