<p>来自<a href="http://docs.python-requests.org/en/latest/user/quickstart/#timeouts" rel="noreferrer">requests documentation</a>:</p>
<blockquote>
<p>You can tell Requests to stop waiting for a response after a given
number of seconds with the timeout parameter:</p>
<pre><code>>>> 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)
</code></pre>
<p>Note:</p>
<p>timeout is not a time limit on the entire response download; rather,
an exception is raised if the server has not issued a response for
timeout seconds (more precisely, if no bytes have been received on the
underlying socket for timeout seconds).</p>
</blockquote>
<p>在我看来,requests.get()需要很长时间才能返回,即使<code>timeout</code>是1秒。有几种方法可以克服这个问题:</p>
<p><strong>1。使用内部类<code>TimeoutSauce</code></p>
<p>发件人:<a href="https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896" rel="noreferrer">https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896</a></p>
<blockquote>
<pre><code>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
</code></pre>
<p>This code should cause us to set the read timeout as equal to the
connect timeout, which is the timeout value you pass on your
Session.get() call. (Note that I haven't actually tested this code, so
it may need some quick debugging, I just wrote it straight into the
GitHub window.)</p>
</blockquote>
<p><strong>2。使用来自kevinburke的请求分支:</strong><a href="https://github.com/kevinburke/requests/tree/connect-timeout" rel="noreferrer">https://github.com/kevinburke/requests/tree/connect-timeout</a></p>
<p>从它的文档中:<a href="https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst" rel="noreferrer">https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst</a></p>
<blockquote>
<p>If you specify a single value for the timeout, like this:</p>
<pre><code>r = requests.get('https://github.com', timeout=5)
</code></pre>
<p>The timeout value will be applied to both the connect and the read
timeouts. Specify a tuple if you would like to set the values
separately:</p>
<pre><code>r = requests.get('https://github.com', timeout=(3.05, 27))
</code></pre>
</blockquote>
<p>注:<a href="https://github.com/kennethreitz/requests/pull/1801" rel="noreferrer">The change has since been merged to the main Requests project</a>。</p>
<p><strong>3。使用类似问题中已经提到的<code>evenlet</code>或<code>signal</code>:</strong>
<a href="https://stackoverflow.com/questions/21965484/timeout-for-python-requests-get-entire-response">Timeout for python requests.get entire response</a></p>