Python 3.x 为什么;“请求”;模块超时不';你不能在蟒蛇3中工作吗?

Python 3.x 为什么;“请求”;模块超时不';你不能在蟒蛇3中工作吗?,python-3.x,python-requests,urllib3,Python 3.x,Python Requests,Urllib3,我想获取URL的内容,如果遇到50XHTTP错误代码,请重试10次,重试间隔为0.5秒。我还希望我的请求有1秒的超时时间。为了实现这一目标,我尝试了以下计划: #!/usr/bin/python3 import sys import requests from urllib3.util.retry import Retry from requests.adapters import HTTPAdapter URL = "http://<DOMAIN>/Loader.asp

我想获取URL的内容,如果遇到
50X
HTTP错误代码,请重试10次,重试间隔为0.5秒。我还希望我的请求有1秒的超时时间。为了实现这一目标,我尝试了以下计划:

#!/usr/bin/python3

import sys
import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter    

URL = "http://<DOMAIN>/Loader.aspx?ParTree=15131H&i=" # + stockid


def get_data(stockid):

    print("1")
    req_session = requests.Session()

    print("2")
    retries = Retry(total = 10, 
                    backoff_factor = 0.5,
                    status_forcelist = [500, 502, 503, 504])

    print("3")
    req_session.mount("http://", HTTPAdapter(max_retries=retries))

    print("4")
    page_content = req_session.get(URL + stockid, timeout=1).content

    print("5")

get_data(sys.argv[1])
#/usr/bin/python3
导入系统
导入请求
从urllib3.util.retry导入重试
从requests.adapters导入HTTPAdapter
URL=”http:///Loader.aspx?ParTree=15131H&i=“#+stockid
def get_数据(stockid):
打印(“1”)
请求会话=请求。会话()
打印(“2”)
重试次数=重试次数(总计=10次,
退避系数=0.5,
状态(强制列表=[500502503504])
打印(“3”)
请求会话挂载(“http://”,HTTPAdapter(最大重试次数=重试次数))
打印(“4”)
page\u content=req\u session.get(URL+stockid,超时=1)。内容
打印(“5”)
获取_数据(sys.argv[1])

不幸的是,在屏幕上打印4后,它会冻结数分钟。怎么了?

首先,我是Windows用户。您的
超时
工作正常。这里的
退避系数
产生了问题。尝试:

#!/usr/bin/python3

import sys
import requests
from requests.packages.urllib3.util.retry import Retry # requests.packages. is not necessary
from requests.adapters import HTTPAdapter    

URL = "http://<DOMAIN>/Loader.aspx?ParTree=15131H&i=" # + stockid


def get_data(stockid):

    print("1")
    req_session = requests.Session()

    print("2")
    retries = Retry(total = 10, 
                    backoff_factor = 0.5,
                    status_forcelist = [500, 502, 503, 504])
    requests.packages.urllib3.util.Retry.BACKOFF_MAX = 0.5 # required
    # requests.packages. is not necessary
    # it isin't necessary you have to mount this way
    print("3")
    adapter = HTTPAdapter(max_retries=retries)
    req_session.mount('http://', adapter)
    req_session.mount('https://', adapter)

    print("4")
    page_content = req_session.get(URL + stockid, timeout=1).content

    print("5")

get_data(sys.argv[1])

有文件证明,当您使用退避系数时:

它的长度永远不会超过
重试。后退\u MAX
(默认情况下为
120

因此,当您尝试链接时,
BACKOFF\u MAX
会先于
BACKOFF\u因子
,从而增加执行时间。因此,设置:

requests.packages.urllib3.util.Retry.BACKOFF_MAX = 0.5
我会帮你的。
但不应引发此错误,因为它定义为:

min(self.BACKOFF_MAX, backoff_value)
在:


如何调用代码?这意味着:什么是
sys.argv[1]
id
未使用,因此不需要它…@Manuel抱歉,这是一个打字错误。我编辑了这个问题。谢谢。它可以很好地处理可访问的URL。请给我们完整的信息link@InfinityTM由于web服务器的行为是不确定的,添加这样的信息没有多大帮助。可访问的URL没有问题,当web服务器在预期时间内没有响应时会出现问题。
backoff\u因子
是失败请求之间的延迟时间吗?
backoff\u因子
就像
sleep()
,它在重试之间的特定时间处于休眠状态。我不明白为什么我必须更改
退避\u MAX
。根据您在API文档中的引用,我的退避系数必须小于
backoff\u MAX
。但是为什么我需要更改
BACKOFF\u MAX
的值呢?我会在投入一点时间后回复,IPTable规则会让主机丢弃数据包。它不会返回任何响应。正如您前面所说,所有问题都与退避因素角色有关。它没有线性效应。
min(self.BACKOFF_MAX, backoff_value)
urllib3.util.retry