我正在使用线程来调用一个运行为:
的函数def fillIQ(ipno):
global inp_width
global no_exit
try:
while 1 :
if no_exit==1:
sys.exit() # <exit line>
tags=[]
for i in range(ipno):
yn=random.randint(0,1)
if yn==1:
voqno=random.randint(0,ipno-1)
if inpQ[i][voqno]<10:
inpQ[i][voqno]+=1
tag="iq"
tags.append(tag)
d.update()
time.sleep(2)
d.delete("iq")
drawIQ(ipno)
except BaseException ,e:
print "fillIQ > "+e
我正在改变main函数中no_exit的值。但是一旦我改变它,线程就不会退出。因为下次我为另一个具有不同输入的实例创建一个线程(它是一个GUI程序。对于一个输入我执行线程,然后更改输入并再次执行它),odler线程似乎运行。
答案 0 :(得分:0)
要退出线程,您必须从中返回或引发SystemExit()。返回实际上会在线程的上下文中引发SystemExit异常。但你正在抓住这个例外而不是重新提升它。
>>> isinstance(SystemExit(1), BaseException)
True
有你的问题。要么单独捕获SystemExit异常并明确地重新提升它,要么对你的一般捕获更有选择性,或者重新提升你捕获的一切。为简洁起见,我举一个前者的例子
except SystemExit:
raise
except BaseException:
print "fillIQ > ", e
另外,请注意它是, e
而不是+e
,因为e不是字符串。我遇到了一些其他问题,只是试图让你的线程运行,但我相信你会很快把它们搞清楚,大多数都缺少你的例子中没有列出的导入和其他值。