为什么在重新启动线程时需要重新创建实例?
想象一下以下课程:
Class Object(threading.Thread):
# some initialisation blabla
def run(self):
while True:
# do something
sleep(1)
class Checker():
def check_if_thread_is_alive(self):
o = Object()
o.start()
while True:
if not o.is_alive():
o.start()
我想重新启动线程以防万一。这不起作用。因为线程只能启动一次。第一个问题。为什么是这样?
据我所知,我必须重新创建的每个实例Object
并调用start()
以再次启动线程。如果是Object
s,这不是很实际。我必须读取旧值的当前值Object
,创建一个新值,并使用旧值在新对象中设置参数。第二个问题:这可以用更聪明,更轻松的方式完成吗?
-
之所以以这种方式实现threading.Thread,是为了保持线程对象与操作系统线程之间的对应关系。在主要的操作系统中,无法重新启动线程,但是您可以
使用另一个线程id 创建另一个线程。如果重新创建是一个问题,则无需从threading.Thread继承类,只需将目标参数传递给Thread的构造函数,如下所示:
class MyObj(object): def __init__(self): self.thread = threading.Thread(target=self.run) def run(self): ...
然后,您可以访问线程成员以控制线程执行,并根据需要重新创建它。不需要MyObj娱乐。