在完成之前在python中杀死一个线程

时间:2013-07-11 15:12:42

标签: python multithreading kill

我做了一点搜索,发现没有办法在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?

2 个答案:

答案 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%。