我找到了两种方法来实现我的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()
你怎么看?
感谢
答案 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()