当对象被删除时从类中停止Python线程

问题描述 投票:0回答:1

我正在构建一个类,它有一个线程在后台执行一些工作。我希望每当类也被删除或超出范围时删除该线程。我正在使用的代码相当于这样:

from threading import Thread
from time import sleep
import sys

class Test:
    def __init__ (self):
        self._running_thread = False
        self._thread = None
    
    def _workFunc (self):
        while self._running_thread:
            print("Working...")
            sleep(1)
    
    def startThread (self):
        self._running_thread = True
        self._thread = Thread(target=self._workFunc)
        self._thread.start()
    
    def stopThread (self):
        self._running_thread = False
        self._thread.join()
    
    def __del__ (self):
        self.stopThread()

def main ():
    test = Test()
    test.startThread()
    sleep(3)
    print("Going out of scope!")

if __name__ == "__main__":
    sys.exit(main())

我期望的是线程启动,工作消息打印三到四次,然后

test
对象超出范围,
__del__
被调用,一旦线程完成,程序的执行就会恢复完成的。相反,发生的事情是“超出范围!”三秒后打印消息,但线程无限期地保持打印“工作”。发生了什么事,我怎样才能得到我想要的效果?

python multithreading oop
1个回答
0
投票

您应该使用守护线程,因为当主程序退出时它们会自动终止。这可以确保您的程序不会无限期地运行。

创建线程时,只需传递 daemon=true 作为参数即可将其指定为守护进程。

喜欢:

def startThread(self):
    self._running_thread = True
    self._thread = Thread(target=self._workFunc, daemon=True)
    self._thread.start()

阅读更多这里

© www.soinside.com 2019 - 2024. All rights reserved.