python“;赋值前引用的局部变量“;有几百条线

python“;赋值前引用的局部变量“;有几百条线,python,multithreading,Python,Multithreading,我对python中线程内部执行的一段代码有问题。一切正常,直到我开始使用100或150多个线程,然后在几个线程中出现以下错误: resp.read(1) UnboundLocalError: local variable 'resp' referenced before assignment. 代码如下: try: resp = self.opener.open(request) code = 200 except urllib2.HTT

我对python中线程内部执行的一段代码有问题。一切正常,直到我开始使用100或150多个线程,然后在几个线程中出现以下错误:

    resp.read(1)
UnboundLocalError: local variable 'resp' referenced before assignment.
代码如下:

    try:
        resp = self.opener.open(request)
        code = 200
    except urllib2.HTTPError as e:
        code = e.code
        #print e.reason,_url
        #sys.stdout.flush()
    except urllib2.URLError as e:
        resp = None
        code = None

    try:
        if code:
            # ttfb (time to first byte)
            resp.read(1)
            ttfb = time.time() - start
            # ttlb (time to last byte)
            resp.read()
            ttlb = time.time() - start
        else:
            ttfb = 0
            ttlb = 0
    except httplib.IncompleteRead:
        pass
如您所见,如果由于异常而未分配“resp”,则应引发异常,并且无法分配“code”concount,因此无法输入“resp.read(1)”

有人知道它失败的原因吗?我想这与作用域有关,但我不知道如何避免这种情况,或者如何以不同的方式实现它


感谢和问候。

定义和使用resp变量不是同一个代码块。其中一个在try/except中,另一个在另一个try/except块中。尝试合并它们:

编辑:

ttfb = 0
ttlb = 0
try:
        resp = self.opener.open(request)
        code = 200
        resp.read(1)
        ttfb = time.time() - start
        resp.read()
        ttlb = time.time() - start         
     except urllib2.HTTPError as e:
        code = e.code
        #print e.reason,_url
        #sys.stdout.flush()
    except urllib2.URLError as e:
        pass
    except httplib.IncompleteRead:
        pass

定义和使用resp变量不是同一代码块。其中一个在try/except中,另一个在另一个try/except块中。尝试合并它们:

编辑:

ttfb = 0
ttlb = 0
try:
        resp = self.opener.open(request)
        code = 200
        resp.read(1)
        ttfb = time.time() - start
        resp.read()
        ttlb = time.time() - start         
     except urllib2.HTTPError as e:
        code = e.code
        #print e.reason,_url
        #sys.stdout.flush()
    except urllib2.URLError as e:
        pass
    except httplib.IncompleteRead:
        pass
基本python: 如果在open调用期间出现HttpError,则不会设置resp,但会在异常处理程序中将code设置为e.code。 然后测试代码并调用resp.read(1)

这与线程没有直接关系,但可能是大量线程导致了HTTPError。

Basic python: 如果在open调用期间出现HttpError,则不会设置resp,但会在异常处理程序中将code设置为e.code。 然后测试代码并调用resp.read(1)


这与线程没有直接关系,但可能是大量线程导致了HTTPError。

我认为这是不正确的。当存在与200不同的响应代码(例如404)时,会引发HTTPError。它可以完美地处理404个错误。此外,它可以完美地处理数千个有错误和无错误以及低并发性的请求。可能导致resp未分配的连接错误由URLRERROR afaik管理,因为它们不是HTTP错误(协议错误)。感谢您的回复。@user2336071如果您对此有把握,请告诉我在发生
HTTPError
的情况下,您认为什么是
resp
?@user2336071我同意@dmeister的观点,这几乎肯定是原因所在。特别是,在第一个
try
块中获得异常的唯一方法是调用
opener.open
。如果您确实在那里得到一个异常,
resp
将不会得到任何值。无论如何,测试是很容易的——尝试将
resp=None
添加到
除了HTTPError
块之外的
中,看看这是否会将错误从
UnboundLocalError
更改为
AttributeError
(当您尝试访问
resp.read
时会得到它,其中
resp==None
@glglglglglgl在HTTPError的情况下,例如404未找到,resp将是包含主体的文件对象,是的,404可以有主体。@EdwardLoper我尝试在Exception HTTPError中添加resp=Non,现在我得到了一个非类型错误,所以这似乎是正确的。)问题出在404 HTTP错误上,失败了。但无论如何,我不明白为什么code=200在异常之后运行,以及为什么404 HTTP错误在线程较少的情况下不会导致这种行为。我认为这是不正确的。HTTPError是在响应代码与200不同时出现的,例如404。它工作得非常完美有404个错误。此外,它可以完美地处理数千个有错误和无错误以及低并发性的请求。可能导致未分配resp的连接错误由URLError afaik管理,因为它们不是HTTP错误(协议错误)。谢谢您的回复。@user2336071如果您对此有把握,请告诉我在发生
HTTPError
的情况下,您认为什么是
resp
?@user2336071我同意@dmeister的说法,这几乎肯定是原因。特别是,您可以在第一次
尝试
块I时获得异常的唯一方法从调用
opener.open
。如果确实在那里得到异常,那么
resp
将不会得到任何值。无论如何,测试非常容易——尝试将
resp=None
添加到
除了HTTPError
块之外的
中,看看这是否会将错误从
UnboundLocalError
更改为
AttributeError
(当您尝试访问
resp.read
时会得到它,其中
resp==None
@glglglglglgl在HTTPError的情况下,例如404未找到,resp将是包含主体的文件对象,是的,404可以有主体。@EdwardLoper我尝试在Exception HTTPError中添加resp=Non,现在我得到了一个非类型错误,所以这似乎是正确的。)这是一个问题,404 HTTP错误导致失败。但无论如何,我不明白为什么code=200在异常后运行,以及为什么404 HTTP错误在线程较少的情况下不会导致这种行为。但这不是一个解决方案。我还可以在第二次尝试中添加另一个错误,但UnboundLocalError除外。问题是为什么'resp'变量未分配able?但这不是一个解决方案。我还可以在第二次尝试中添加另一个,但UnboundLocalError除外。问题是为什么未分配'resp'变量?