Python 守护线程未在 Windows 退出

Python daemon threads are not exiting on Windows

我正在尝试了解 Python 中的守护线程。我的理解是,一旦主线程退出或非守护线程被杀死,守护线程就会自动被杀死。但是,在 Windows 机器上,这不是我的观察结果。

import threading
import time


def print_work_a():
    print('Starting of thread :', threading.currentThread().name)
    time.sleep(2)
    print('Finishing of thread :', threading.currentThread().name)


def print_work_b():
    print('Starting of thread :', threading.currentThread().name)
    print('Finishing of thread :', threading.currentThread().name)

a = threading.Thread(target=print_work_a, name='Thread-a', daemon=True)
b = threading.Thread(target=print_work_b, name='Thread-b')

a.start()
b.start()

观察到的输出:

>>> Starting of thread :Thread-a
Starting of thread :Thread-b


Finishing of thread :Thread-b

Finishing of thread :Thread-a

我原以为输出不会包含 Finishing of thread :Thread-a 因为到那时非守护线程将被终止,因此守护线程将也会被杀死。导致守护线程保持活动状态的代码有什么错误?

我不禁注意到你的输出中有一个 >>>。你 running/importing 这是在交互式解释器中吗?如果是这样,交互式解释器仍将 运行ning,因此 daemon 线程有足够的时间退出,除非您在两秒内杀死交互式解释器。您需要 运行 作为来自常规 OS shell 的独立脚本(例如 cmd.exe on Windows、bash 或类似的 UNIX-比如系统等)。

来自docs

A thread can be flagged as a “daemon thread”. The significance of this flag is that the entire Python program exits when only daemon threads are left.

daemon 线程的问题是当 运行 来自 shell(或 IDE)时,例如,the shell本身就是主线程!因此 daemon 线程将与 shell 线程一样存在并完成执行。我猜这就是你的情况。

尝试 运行通过 cmd 运行您的脚本,您的预期输出将会出现。意思是,thread-a 不会完成。将代码复制到 .py 文件后,我 运行 通过基本的 python shell (IDLE) 得到:

>>> Starting of thread :Starting of thread :  Thread-aThread-b

Finishing of thread : Thread-b
Finishing of thread : Thread-a

但是,当运行通过cmd,我得到:

Starting of thread : Thread-a
Starting of thread : Thread-b
Finishing of thread : Thread-b