Python 为什么会出现这个线程错误?

Python 为什么会出现这个线程错误?,python,urllib2,Python,Urllib2,我有以下代码: import urllib2 import thread a = 0 def workers(): while 1: a+=1 silva = urllib2.urlopen('http://en.dilandau.eu/download_music/said-the-whale-'+str(a)+'.html') si = silva.read() if 'var playlist' not in s

我有以下代码:

import urllib2
import thread

a = 0
def workers():

    while 1:

        a+=1
        silva = urllib2.urlopen('http://en.dilandau.eu/download_music/said-the-whale-'+str(a)+'.html')
        si = silva.read()
        if 'var playlist' not in si:
            print a
            break

thread.start_new_thread(workers,())


while 1:
    print '---'
但我有一个错误:

Unhandled exception in thread started by <function workers at 0x0000000002B1FDD8>
由启动的线程中未处理的异常 有人知道我为什么会出现此错误吗?

您在函数中分配给“a”,因此它默认为函数的本地属性

例外情况可能是:

UnboundLocalError: local variable 'a' referenced before assignment
您将在函数中指定给“a”,因此它默认为函数的本地

例外情况可能是:

UnboundLocalError: local variable 'a' referenced before assignment

我运行了一个更简单的代码版本,除了未处理的异常消息之外,还看到了堆栈跟踪。它应该可以帮助您找到问题所在

有一些改进你应该考虑。首先,有一个高级库
threading
,建议优先于
thread
。其次,您正在使用
执行繁忙的等待,而1
循环!使用
join()
更可取。通常,在工作代码周围放置异常处理程序也会有所帮助。比如说,

import threading
import time
import traceback

def worker():
    try:
        for i in range(5):
            print i
            time.sleep(0.5)
        assert 0, 'bad'
    except:
        traceback.print_exc()

t = threading.Thread(target=worker)

t.start()
t.join()

print 'completed'

我运行了一个更简单的代码版本,除了未处理的异常消息之外,还看到了堆栈跟踪。它应该可以帮助您找到问题所在

有一些改进你应该考虑。首先,有一个高级库
threading
,建议优先于
thread
。其次,您正在使用
执行繁忙的等待,而1
循环!使用
join()
更可取。通常,在工作代码周围放置异常处理程序也会有所帮助。比如说,

import threading
import time
import traceback

def worker():
    try:
        for i in range(5):
            print i
            time.sleep(0.5)
        assert 0, 'bad'
    except:
        traceback.print_exc()

t = threading.Thread(target=worker)

t.start()
t.join()

print 'completed'

如果只是为了消除错误,请在worker()函数中添加
全局a
如果只是为了消除错误,请在worker()函数中添加
全局a

是否可以添加try/catch块来打印未处理异常的详细信息?不相关,但我建议将
a
的定义移到
workers
函数定义中——它不在线程之间共享,因此最好保持在使用它的一个线程的本地。是否可以添加try/catch块来打印未处理异常的详细信息?不相关,但我建议将
a
的定义移到
workers
函数定义中——它不是在线程之间共享的,因此最好保持在使用它的一个线程的本地。