python - 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,因为到那时非守护线程将被杀死,因此守护线程也将被杀死。导致守护线程保持活动的代码中的错误是什么?
解决方案
从文档:
可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 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
但是,当运行时cmd
,我得到:
Starting of thread : Thread-a
Starting of thread : Thread-b
Finishing of thread : Thread-b
推荐阅读
- python - 将项目附加到 Python 中的列表会覆盖所有现有元素
- excel - 更改本地工作簿
- python - Pandas iterrows 不会遍历数据框
- sql - SQL - Vlookup 版本
- javascript - onclick 事件的 JavaScript/PHP 问题
- c - 如何使用 g_signal_handlers_block_by_func()
- python - 在正则表达式匹配的字符中仅捕获相同的字符
- c# - 如何修复 ASMX Web 服务中的 XML 序列化问题
- winforms - 如何在 WCF 中引发 GUI 事件?
- oauth-2.0 - 无法让 Linkedin 从 socialActions v2 端点返回数据