【问题标题】:killing a thread in python before its done [duplicate]在完成之前杀死python中的线程[重复]
【发布时间】:2013-07-11 15:12:41
【问题描述】:

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

【问题讨论】:

  • 让它间隔睡眠并定期检查其他进程是否完成(设置某种类变量并让它检查一个对象的变量,以指示何时完成)。

标签: python multithreading kill


【解决方案1】:

如何在程序终止时杀死 enbableXThread

如果线程没有任何清理工作,通过将enableXThread.daemon 设置为True 使其成为守护线程。这必须在启动线程之前完成:

self.enableXThread = Thread(target=self.enableX) 
self.enableXThread.daemon = True
self.enableXThread.start()

否则,请使用退出标志(线程检查它们是否应该退出的全局变量)或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)

【讨论】:

  • 如果我将守护进程设置为True,程序终止时它会被杀死吗?
  • 是的,解释器在只剩下守护线程时终止。
  • 是不是说,当线程结束时,它也会杀死整个程序?如果线程完成,我希望整个程序继续运行,但我只想在程序更快完成时杀死线程
  • 您的主线程不是守护线程,因此解释器在完成之前不会终止。
  • 非常感谢这解决了我的问题:)
【解决方案2】:

看起来您的问题已经使用 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%。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2015-02-18
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多