2012-04-19 2 views
1

私は、さまざまなサーバーからWebページを取得する小さなサービスを実装しています。私は異なるタイプのタイムアウトを設定できる必要があります。私はソケットのsettimeoutメソッドでうんざりしようとしましたが、正確には私が好きではありません。ここに問題があります。pythonのさまざまなタイムアウトhttplib

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

  2. 私のコードは、最初に.readのデータ(約10 MB)が書き込まれ、ペイロード全体がこれに収まるようにコードの他の部分に移動します。これに収まらない場合は、ペイロードをメモリーではなくファイルに直接ストリームします。これが起こると、データを取得するために無制限の.read()を実行します。リモート側から1秒ごとに1バイトのデータが送信されると、毎秒1バイトの受信を待っているだけです。私は「あなたは長すぎます」と切り離したいと思っています。スレッドベースのソリューションが最後の手段になります。

答えて

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-アールは、非同期DNS検索を可能にするためにサポートして信号なしに解決される名前のために素敵なタイムアウトを可能にする、libcurlのを構築することを検討してください。

+0

これはうまくいくでしょう。できるだけ外部の依存関係(特にCのもの)を避けたいので、私の最後の手段です。 –

+0

@ NoufalIbrahim:[私は 'pycurl.TIMEOUT'を試してみました。それは動作します](http://stackoverflow.com/a/32685765/4279) – jfs

1

requestsを試しましたか?

あなたは便利http://docs.python-requests.org/en/latest/user/quickstart/#timeouts

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

EDITタイムアウトを設定することができます。 私は質問の一部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/

+0

タイムアウトがペイロードを取得しないようにします。それが私の問題です。また、これはDNSルックアップの問題を解決しません。 –

+0

あなたの質問を見落として申し訳ありません。あなたは正しいですし、質問の2つの部分も解決しようとする答えを編集しました。 – satran

+0

このプロセスに複数のスレッドがある場合、これは機能しない可能性があります。そのシナリオでは、信号ベースのタイムアウトは危険です。 –

関連する問題