我遇到了一段在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”,它应该引发异常,并且“代码”不能分配,因此无法输入“resp.read(1)”。< / p>
任何人都有一些失败的线索吗?我想这与范围有关,但我不知道如何避免这种情况或如何以不同的方式实现它。
谢谢和问候。
答案 0 :(得分:5)
基本python: 如果在打开调用期间存在HttpError,则不会设置resp,但代码将在异常处理程序中设置为e.code。 然后测试代码并调用resp.read(1)。
这与线程无直接关系,但可能是大量线程导致HTTPError。
答案 1 :(得分:0)
定义和使用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