杀死线程困境

时间:2012-06-18 19:29:02

标签: python multithreading

我找到了两种方法来实现我的TerminatableThread课程。 我想问一下你们每个人的利弊或意见,有什么不同吗?

第一个解决方案:使用__stop()类的Thread私有方法:

class TerminatableThread(threading.Thread):
    def __init__(self, *args, **argv):
        threading.Thread.__init__(self, *args, **argv)

    def terminate(self):
        threading.Thread._Thread__stop(self) #@UndefinedVariable

    @property
    def should_run(self):
        return threading.Thread.is_alive(self)

第二个解决方案:使用额外的Event

class TerminatableThread(threading.Thread):
    def __init__(self, *args, **argv):
        self.__terminated = threading.Event()
        threading.Thread.__init__(self, *args, **argv)

    def terminate(self):
        self.__terminated.set()

    @property
    def should_run(self):
        return not self.__terminated.is_set()
你怎么看? 感谢

2 个答案:

答案 0 :(得分:0)

对于第一个解决方案:你不应该使用私有方法,因为它可以改变并且无论如何都是糟糕的形式。另外,线程不应该冷停;你应该让该线程内的进程先有机会进行清理,并自行响应终止请求。

对于第二个解决方案:Python上的抽象类不像Java那样常见,也不像其他语言那样需要。如果你的TerminatableThread本身就是一个线程操作的抽象类,为什么不直接添加terminated行为呢?

class TerminatableThread(threading.Thread):
    def __init__(self, *args, **argv):
        super.__init__(self, *args, **argv)
        self.terminated = False

    # Note: not actually thread-safe
    def terminate(self):
        self.terminated = True

编辑:您删除了“抽象类”提案,但我会使用某种线程安全标记机制。线程事件听起来像他们可能那样做,所以我会选择那个选项。

答案 1 :(得分:0)

也可以使用sys.exit()关闭Python线程,该线程在线程内与thread.exit()相同

def nuke(self):
    # set autodestruct, remove thread from stack and exit thread
    global threads
    try:
        threads.remove([self.threadId,self])
    except:
        sys.exit()