清理线程的最佳方法是什么?Python中的计时器线程?

清理线程的最佳方法是什么?Python中的计时器线程?,python,multithreading,Python,Multithreading,所以我有这两个类,我用它们来调度一个函数到一个计时器中。 它们工作得很好,但是它们将在一个程序中运行很长时间,所以我想确保我正在清理“停止”的线程 没错 有人能帮我解释一下我如何从线程中清除这些线程吗?因为我使用了setDaemon(True)标志 我将如何使用这些课程: 我将创建一个类管理器的对象,并继续调用MyClassManager 谢谢 class Operation(threading._Timer): alive = True def __init__(self,

所以我有这两个类,我用它们来调度一个函数到一个计时器中。 它们工作得很好,但是它们将在一个程序中运行很长时间,所以我想确保我正在清理“停止”的线程 没错

有人能帮我解释一下我如何从线程中清除这些线程吗?因为我使用了setDaemon(True)标志

我将如何使用这些课程: 我将创建一个类管理器的对象,并继续调用MyClassManager

谢谢

class Operation(threading._Timer):
    alive = True

    def __init__(self, *args, **kwargs):
        threading._Timer.__init__(self, *args, **kwargs)
        self.setDaemon(True)

    def run(self):
        while (self.alive):
            self.finished.clear()
            self.finished.wait(self.interval)
            if not self.finished.isSet():
                self.function(*self.args, **self.kwargs)
            else:
                return
            #self.finished.set()

    def run_once(self):
        self.finished.clear()
        self.finished.wait(self.interval)
        if not self.finished.isSet():
            self.function(*self.args, **self.kwargs)
        else:
            return
        self.finished.set()

    def cancel(self):
        self.finished.set()
        self.alive = False

class Manager(object):

    ops = []

    def add_operation(self, operation, interval, args=[], kwargs={}):
        op = Operation(interval, operation, args, kwargs)
        self.ops.append(op)
        thread.start_new_thread(op.run, ())

    def add_oneTimeOperation(self, operation, interval, args=[], kwargs={}):
        op = Operation(interval, operation, args, kwargs)
        self.ops.append(op)
        thread.start_new_thread(op.run_once, ())

    def stop(self):
        for op in self.ops:
            op.cancel()

    def clear_operations(self):
        del self.ops[:]

您不应该在
run()
中调用
self.finished.clear()
;这将创建一个竞争条件。如果在该行运行之前设置了事件,该怎么办?一般来说,清除事件很少是一个好主意,除非你确定目前没有其他人试图设置它们,这通常很难确保。没错,你是对的。但是,我调用finished.set()的唯一位置是run_once()的末尾,这应该不是问题,而在cancel()中,它不会与run()同时被调用。所以我认为我在这方面还可以。谢谢你的反馈!如果在线程运行时从不调用它,
cancel()
有什么意义呢?我明白你现在说的了。我去试试,谢谢!