0

我在 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”不能被分配,所以它不能进入​​“resp.read(1)”。

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

谢谢并恭祝安康。

4

2 回答 2

5

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

这与线程直接无关,但可能是线程数过多导致了HTTPError。

于 2013-04-30T13:46:29.873 回答
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
于 2013-04-30T13:45:15.023 回答