首页 > 解决方案 > Python 守护程序线程未在 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

我期待输出不会包含线程的完成:Thread-a,因为到那时非守护线程将被杀死,因此守护线程也将被杀死。导致守护线程保持活动的代码中的错误是什么?

标签: pythonpython-3.xpython-multithreading

解决方案


文档

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。

例如,线程的问题daemon是当从 shell(或 IDE)运行时,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

在 Python IDLE 中显示上述结果的图像

但是,当运行时cmd,我得到:

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

显示在终端中运行给出的上述结果的图像


推荐阅读