在创建以下代码时,我试图创建一个可能被异常终止的线程类(因为我试图让线程等待事件)。
import sys
class testThread(threading.Thread):
def __init__(self):
super(testThread,self).__init__()
self.daemon = True
def run(self):
try:
print('Running')
while 1:
pass
except:
print('Being forced to exit')
test1 = testThread()
test2 = testThread()
print(test1.daemon)
test1.run()
test2.run()
sys.exit()
但是,运行该程序只会打印出一条“正在运行”消息,直到另一条消息终止。为什么会这样?
答案 0 :(得分:4)
问题在于您正在调用run
方法。
这只是您实现的一个普通的旧方法,它可以执行您放在其主体中的任何内容。在这种情况下,主体是一个无限循环,因此调用run
只会永远循环。
启动线程的方法是start
方法。此方法是Thread
类的一部分,它的作用是:
开始线程的活动。
每个线程对象最多只能调用一次。它安排在单独的控制线程中调用对象的
run()
方法。
因此,如果调用此方法,它将启动一个新线程,使该新线程运行您的run()
方法,然后立即返回,以便主线程可以继续执行其他操作。 1 这就是您想要的。
1。正如Jean-FrançoisFabre指出的那样,您仍然不会在这里获得任何真正的并行性。繁忙的循环从来都不是多线程代码中的好主意,如果您在CPython或PyPy中运行它,几乎所有繁忙的循环都在保持GIL的同时执行Python字节码,并且一次只能有一个线程保持GIL。因此,从粗略的角度看,事情看起来是并发的,三个线程正在运行,所有线程都在进步。但是,如果放大,则几乎没有重叠,两个线程同时进行,通常甚至不足以弥补小的调度程序开销。