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」が割り当てられていない場合は、例外が発生し、「コード」が割り当てられないため、「resp.read(1)」に入力できませんでした。

誰が失敗しているのかについての手がかりを持っていますか? スコープに関連していると思いますが、これを回避する方法や別の方法で実装する方法がわかりません。

ありがとうございます。

4

2 に答える 2

5

基本的な python: open 呼び出し中に HttpError が発生した場合、resp は設定されませんが、コードは例外ハンドラーで e.code に設定されます。次に、コードがテストされ、resp.read(1) が呼び出されます。

これはスレッドとは直接関係ありませんが、スレッド数が多いために HTTPError が発生した可能性があります。

于 2013-04-30T13:46:29.873 に答える
0

resp 変数の定義と使用は、同じコード ブロックではありません。1 つは try/except にあり、もう 1 つは別の 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 に答える