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