当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件):
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()
但是,运行程序只会打印出一条Running消息,直到另一条终止。这是为什么?
最佳答案
问题是您正在调用 run
方法。
这只是您实现的一个普通的旧方法,它会执行您放入其主体中的任何操作。在这种情况下,正文是一个无限循环,因此调用 run
只会永远循环下去。
启动线程的方式是start
方法。此方法是 Thread
类的一部分,它的作用是:
Start the thread’s activity.
It must be called at most once per thread object. It arranges for the object’s
run()
method to be invoked in a separate thread of control.
因此,如果您调用它,它将启动一个新线程,使该新线程运行您的 run()
方法,并立即返回,因此主线程可以继续做其他事情。< sup>1 这就是你想要的。
<子>1。正如让-弗朗索瓦·法 bool (Jean-François Fabre) 所指出的,您仍然不会在这里获得任何真正的并行性。繁忙循环在多线程代码中从来都不是一个好主意,如果你在 CPython 或 PyPy 中运行它,几乎所有的繁忙循环都是在执行 Python 字节码的同时持有 GIL,并且一次只有一个线程可以持有 GIL。因此,从粗略的角度来看,事情看起来是并发的——三个线程在运行,并且都在取得进展。但如果放大,两个线程同时进行的地方几乎没有重叠,通常甚至不足以弥补较小的调度程序开销。
关于Python线程运行()阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493839/