110

私のスクリプトでは、requests.get決して返されません:

import requests

print ("requesting..")

# This call never returns!
r = requests.get(
    "http://www.some-site.com",
    proxies = {'http': '222.255.169.74:8080'},
)

print(r.ok)

考えられる理由は何ですか?何か救済策はありますか?使用するデフォルトのタイムアウトは何getですか?

4

6 に答える 6

161

get が使用するデフォルトのタイムアウトは?

デフォルトのタイムアウトは ですNone。これは、接続が閉じられるまで待機 (ハング) することを意味します。

次のように、タイムアウト値を指定するだけです。

r = requests.get(
    'http://www.justdial.com',
    proxies={'http': '222.255.169.74:8080'},
    timeout=5
)
于 2013-07-22T07:59:49.970 に答える
42

リクエストのドキュメントから:

timeout パラメータを使用して、指定された秒数が経過したら応答の待機を停止するようにリクエストに指示できます。

>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

ノート:

タイムアウトは、応答ダウンロード全体の制限時間ではありません。むしろ、サーバーが timeout 秒の間応答を発行しなかった場合 (より正確には、timeout 秒の間、​​基礎となるソケットでバイトが受信されなかった場合) に例外が発生します。

timeoutrequests.get()が1秒であっても、戻るのに非常に長い時間がかかることがよくあります。この問題を解決するには、いくつかの方法があります。

1.TimeoutSauce内部クラスを使用する

から: https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896

import requests from requests.adapters import TimeoutSauce

class MyTimeout(TimeoutSauce):
    def __init__(self, *args, **kwargs):
        if kwargs['connect'] is None:
            kwargs['connect'] = 5
        if kwargs['read'] is None:
            kwargs['read'] = 5
        super(MyTimeout, self).__init__(*args, **kwargs)

requests.adapters.TimeoutSauce = MyTimeout

このコードにより、読み取りタイムアウトを接続タイムアウトと同じに設定する必要があります。これは、Session.get() 呼び出しで渡すタイムアウト値です。(このコードを実際にテストしていないことに注意してください。そのため、簡単なデバッグが必要になる場合があります。GitHub ウィンドウに直接書き込んだだけです。)

2. kevinburke からのリクエストのフォークを使用します: https://github.com/kevinburke/requests/tree/connect-timeout

ドキュメントから: https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst

次のように、タイムアウトに単一の値を指定する場合:

r = requests.get('https://github.com', timeout=5)

タイムアウト値は、接続タイムアウトと読み取りタイムアウトの両方に適用されます。値を個別に設定する場合は、タプルを指定します。

r = requests.get('https://github.com', timeout=(3.05, 27))

注:その後、変更はメインの Requests プロジェクトにマージされました

3. evenletorsignalを使用して、同様の質問で既に述べたように: Timeout for python requests.get whole response

于 2014-03-13T11:40:17.933 に答える