player-none 发表于 2025-3-1 13:28:36

在程序停止时终止所有线程的一种方法

如题。

这个问题其实困扰了我很久,以前想要在程序终止时停止线程使用的是 atexit.register(stopThreads);但这不起作用。

我试了各种方法,比如说 win32api 之类的……

但令我崩溃的是,网上搜到的(我用的 Bing)大部分居然是 AI 的内容。csdn,简书,geekdocks,到处都是 ai 的殖民地。

最接近成功的方法是定义一个变量,线程里不断检测它。但新的问题也来了……

如果线程是 socket.socket().accept / recv 这样别人写的代码呢?我怎么不断检测这个变量?

现在,我知道了:使用 DAEMON THREAD(守护线程)。

具体来说,在定义线程时指定 keyword-argument daemon 为 True,所有这样的线程都会在主线程退出时自动关闭。

我们可以简单封装一下这个功能。

class Thread(threading.Thread):
    def __init__(self, target, args=(), kwargs=None):
      super().__init__(target=target, args=args, kwargs=kwargs, daemon=True)


使用线程时,只需要 Thread(threadFunc, (1, 1, 4, 5, 1, 4), {'ikun': True}).start() 就行了。

FishC 发表于 2025-3-1 13:28:46

在程序停止时终止所有线程,使用守护线程(Daemon Thread)是一个有效的方法。守护线程会在主程序退出时自动结束。你已经提到了一种实现方法,下面是一个更详细的说明和示例:

使用守护线程的步骤

步骤 1: 在创建线程时,将 daemon 参数设置为 True。这样,这个线程就会成为一个守护线程。

步骤 2: 主线程中退出后,所有未完成的守护线程都会自动终止。

以下是你提供的代码的封装示例:


import threading

class Thread(threading.Thread):
    def __init__(self, target, args=(), kwargs=None):
      super().__init__(target=target, args=args, kwargs=kwargs, daemon=True)

# 示例线程函数
def threadFunc(a, b, c):
    while True:
      print("Running thread with:", a, b, c)

# 使用自定义的 Thread 类
t = Thread(target=threadFunc, args=(1, 1, 4))
t.start()

# 主线程的其他工作...
print("Main thread is running")

# 主线程结束后,守护线程也会自动终止


通过这种方式,可以轻松地在程序退出时自动终止所有线程。如果你有任何其他问题,请随时问我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 在程序停止时终止所有线程的一种方法