首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么requests.get()不返回?requests.get()使用的默认超时是多少?

为什么requests.get()不返回?requests.get()使用的默认超时是多少?
EN

Stack Overflow用户
提问于 2013-07-22 15:31:58
回答 6查看 115K关注 0票数 108

在我的脚本中,requests.get从不返回:

代码语言:javascript
复制
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使用的默认超时是多少?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-07-22 15:59:50

get使用的默认超时是多少?

默认超时是None,这意味着它将等待(挂起),直到连接关闭。

只需指定一个超时值,如下所示:

代码语言:javascript
复制
r = requests.get(
    'http://www.justdial.com',
    proxies={'http': '222.255.169.74:8080'},
    timeout=5
)
票数 160
EN

Stack Overflow用户

发布于 2014-03-13 19:40:18

来自requests documentation

通过timeout parameter:

requests.get('http://github.com',timeout=0.001) Traceback (最近一次调用):File "",第1行,in requests.exceptions.Timeout: HTTPConnectionPool( =‘github.com’,port=80):Request timed out,你可以告诉请求在给定的秒数后停止等待响应。(timeout=0.001)

注意:

超时不是整个响应下载的时间限制;相反,如果服务器没有发出超时秒数的响应(更准确地说,如果在基础套接字上没有接收到timeout seconds).的字节),则会引发异常

我经常遇到这样的情况:即使timeout是1秒,requests.get()也需要很长时间才能返回。有几种方法可以解决这个问题:

1.使用 TimeoutSauce 内部类

来自:https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896

从requests.adapters导入TimeoutSauce MyTimeout请求(TimeoutSauce):def __init__(

,*args,**kwargs):如果kwargs‘’connect‘为None: kwargs’‘connect’=5如果kwargs‘’read‘为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))

注:The change has since been merged to the main Requests project

3.使用类似问题中已经提到的evenlet signal 或: Timeout for python requests.get entire response

票数 41
EN

Stack Overflow用户

发布于 2019-04-25 12:31:20

我想要在一堆代码中轻松添加一个默认超时(假设超时解决了您的问题)

这是我从提交给存储库的请求工单中获得的解决方案。

图片来源:https://github.com/kennethreitz/requests/issues/2011#issuecomment-477784399

解决方案是这里的最后几行,但为了更好的上下文,我展示了更多的代码。我喜欢使用会话来实现重试行为。

代码语言:javascript
复制
import requests
import functools
from requests.adapters import HTTPAdapter,Retry


def requests_retry_session(
        retries=10,
        backoff_factor=2,
        status_forcelist=(500, 502, 503, 504),
        session=None,
        ) -> requests.Session:
    session = session or requests.Session()
    retry = Retry(
            total=retries,
            read=retries,
            connect=retries,
            backoff_factor=backoff_factor,
            status_forcelist=status_forcelist,
            )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    # set default timeout
    for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
        setattr(session, method, functools.partial(getattr(session, method), timeout=30))
    return session

然后你可以这样做:

代码语言:javascript
复制
requests_session = requests_retry_session()
r = requests_session.get(url=url,...
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17782142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档