python“赋值前引用的局部变量”,有数百个线程

时间:2013-04-30 13:43:03

标签: 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.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>

任何人都有一些失败的线索吗?我想这与范围有关,但我不知道如何避免这种情况或如何以不同的方式实现它。

谢谢和问候。

2 个答案:

答案 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