python“;赋值前引用的局部变量“;有几百条线
我对python中线程内部执行的一段代码有问题。一切正常,直到我开始使用100或150多个线程,然后在几个线程中出现以下错误: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
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'变量?