2017-07-06 4 views
0

私のプロジェクトのリクエストライブラリでプロキシを使用しています。プロキシを使用すると、それぞれの要求には異なる(予測不可能な)時間がかかります。特定の要求が一定時間以上かかる場合時間制限がPYTHONを超えた場合は、繰り返しを省略します。

for proxy in proxyList: 
    r=requests.post(url, proxies=proxy, data=payload) 

、私はこれを行うことができ、それをスキップしてnext.Howに移動したいですか?
編集:タイムアウトパラメータを使用すると例外が発生します。もちろん、私は例外処理で自分の作業を行うことができます。しかし、私はより一般的な意味でそれを望んでいました。時間があらかじめ定義されていない文?次の繰り返しに進む方法はありますか?

マック/ UNIXシステムで
+0

リクエストのドキュメントを確認しましたか? 'post()'はタイムアウトパラメータをとります。 – Jkdc

+0

@Jkdcそれは例外を発生させます。もちろん、私は例外処理によって私の仕事をやることができます。しかし、私はより一般的な意味でそれを望んでいました...もし私が要求について話していなければどうですか?あらかじめ定義することはできませんか?次の繰り返しに進む方法はありますか? –

答えて

1

、あなたはこのような一定期間後にカスタム例外を発生させることができます。

import signal 

class TimeoutException(Exception): # custom exception 
    pass 

def timeout_handler(signum, frame): # raises exception when signal sent 
    raise TimeoutException 

# Makes it so that when SIGALRM signal sent, it calls the function timeout_handler, which raises your exception 
signal.signal(signal.SIGALRM, timeout_handler) 

# Start the timer. Once 5 seconds are over, a SIGALRM signal is sent. 
for proxy in proxyList: 
    signal.alarm(5) 
    try: 
     r=requests.post(url, proxies=proxy, data=payload) 
    except TimeoutException: 
     pass 

を基本的には、時間制限がある後にするとき、あなたが上げのカスタム例外を作成しています(つまり、SIGALRMが送信されます)。もちろん、制限時間を調整することができます。

もっと単純にの場合は、わかる限り、timeoutパラメータを使用できます。 documentationはこう言っています:

タイムアウトパラメータを使用して、要求が指定された秒数後に応答を待つことを停止するように指示できます。ほぼすべてのプロダクションコードでは、ほぼすべての要求でこのパラメータを使用する必要があります。そうしないと、[...]あなたのプログラムがハングアップしているように

を引き起こす可能性がありますので、あなたのコードは

for proxy in proxyList: 
    r=requests.post(url, proxies=proxy, data=payload, timeout=1) 

ように見える終わるでしょう(タイムアウトパラメータは秒である。)

+0

Windows上で実行する方法はありますか? –

1

追加電話番号posttimeout=10(たとえば)を呼び出します。

r = requests.post(url, proxies=proxy, data=payload, timeout=10) 

help(requests.post)またはdocumentationをご覧ください。

+0

タイムアウトすると例外が発生すると思います。 http://docs.python-requests.org/ja/master/user/quickstart/#timeoutsまた、ダウンロードを待っている場合、タイムアウトは機能しません。 – RNikoopour

+0

「ダウンロードを待っている場合」とはどういう意味ですか?すべてのHTTPリクエストはHTTPリクエストです。特別なダウンロードモードはありません。 – kindall

+0

'タイムアウトは応答のダウンロード全体の時間制限ではありません。むしろ、サーバーがタイムアウト秒(より正確には、タイムアウト秒の間に下位のソケットで受信されたバイトがない場合)の応答を発行していない場合、例外が発生します。 '接続が確立されたが大量のデータタイムアウトは発生しません。 – RNikoopour

関連する問題