我做了一点搜索,发现没有办法在python中杀死一个线程,但是如何解决像我这样的问题呢?
我有一个函数将X设置为True一小时,然后将其设置为False。
有时程序完成的时间少于所需的小时数,但线程仍在运行并在内存中生成垃圾。
def enableX():
self.x=True
sleep(3600)
self.x=False
def function1():
self.enableXThread=Thread(target=self.enableX)
self.enableXThread.start()
任何想法?无论线程是否完成,如何在程序终止时杀死enbableXThread?
答案 0 :(得分:1)
程序终止时如何杀死enbableXThread
如果线程没有要做任何清理,可以将enableXThread.daemon
设置为True
,使其成为守护程序线程。这必须在启动线程之前完成:
self.enableXThread = Thread(target=self.enableX)
self.enableXThread.daemon = True
self.enableXThread.start()
否则,使用exit标志(线程检查的全局变量以查看它们是否应该退出)或Event
处理程序。
您可能还考虑使用信号,因为这可能比线程更简单;你可以简单地设置一小时的警报并让处理程序重置变量。如果您的过程在闹钟响起之前结束,则不会发生任何事情。请注意,这在Windows上不可用。
import signal
X = False
def handle_alarm(signum, frame):
global X
X = False
signal.signal(signal.SIGALRM, handle_alarm)
def set_X_true_then_false_later(secs=3600):
global X
X = True
signal.alarm(secs)
答案 1 :(得分:0)
看起来您的问题已经使用kindall的建议解决了,但如果您有兴趣能够终止另一个线程,则您可能会对以下内容感兴趣。
如果你不介意你的代码运行速度慢十倍,你可以使用下面实现的Thread2
类。下面的示例显示了调用新的stop
方法应该如何杀死下一个字节码指令上的线程。
import threading
import sys
class StopThread(StopIteration): pass
threading.SystemExit = SystemExit, StopThread
class Thread2(threading.Thread):
def stop(self):
self.__stop = True
def _bootstrap(self):
if threading._trace_hook is not None:
raise ValueError('Cannot run thread with tracing!')
self.__stop = False
sys.settrace(self.__trace)
super()._bootstrap()
def __trace(self, frame, event, arg):
if self.__stop:
raise StopThread()
return self.__trace
class Thread3(threading.Thread):
def _bootstrap(self, stop_thread=False):
def stop():
nonlocal stop_thread
stop_thread = True
self.stop = stop
def tracer(*_):
if stop_thread:
raise StopThread()
return tracer
sys.settrace(tracer)
super()._bootstrap()
################################################################################
import time
def main():
test = Thread2(target=printer)
test.start()
time.sleep(1)
test.stop()
test.join()
def printer():
while True:
print(time.time() % 1)
time.sleep(0.1)
if __name__ == '__main__':
main()
Thread3
类似乎运行代码的速度比Thread2
类快大约33%。