为什么在重新启动线程时需要重新创建实例?

发布于 2021-01-29 17:41:28

想象一下以下课程:

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()以再次启动线程。如果是Objects,这不是很实际。我必须读取旧值的当前值Object,创建一个新值,并使用旧值在新对象中设置参数。第二个问题:这可以用更聪明,更轻松的方式完成吗?

关注者
0
被浏览
81
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    之所以以这种方式实现threading.Thread,是为了保持线程对象与操作系统线程之间的对应关系。在主要的操作系统中,无法重新启动线程,但是您可以
    使用另一个线程id 创建另一个线程。

    如果重新创建是一个问题,则无需从threading.Thread继承类,只需将目标参数传递给Thread的构造函数,如下所示:

    class MyObj(object):
        def __init__(self):
            self.thread = threading.Thread(target=self.run)
        def run(self):
            ...
    

    然后,您可以访问线程成员以控制线程执行,并根据需要重新创建它。不需要MyObj娱乐。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看