解决python父线程关闭后子线程不关闭问题
作者:吹牛皮冠军获得者 发布时间:2023-11-28 22:01:56
标签:python,父线程,子线程
我们都知道,python可以通过threading module来创建新的线程,然而在创建线程的线程(父线程)关闭之后,相应的子线程可能却没有关闭,这可能是因为代码中没有使用setDaemon(True)函数。
接下来,使用一个例子来说明:
import threading
def prt_hello() :
while 1 :
print 'hello'
if __name__ == '__main__' :
t = threading.Thread(target=prt_hello)
t.setDaemon(True)
t.start()
我们需要把setDaemon函数放在start函数前面,不然它是不给通过的,并且返回'cannot set daemon status of active thread‘
补充知识:Python 多线程的退出/停止的一种是实现思路
在使用多线程的过程中,我们知道,python的线程是没有stop/terminate方法的,也就是说它被启动后,你无法再主动去退出它,除非主进程退出了,注意,是主进程,不是线程的父进程.
一个比较合理的方式就是把原因需要放到threading.Thread的target中的线程函数,改写到一个继承类中,下面是一个实现例子
import threading
import time
import os
# 原本需要用来启动的无线循环的函数
def print_thread():
pid = os.getpid()
counts = 0
while True:
print(f'threading pid: {pid} ran: {counts:04d} s')
counts += 1
time.sleep(1)
# 把函数放到改写到类的run方法中,便可以通过调用类方法,实现线程的终止
class StoppableThread(threading.Thread):
def __init__(self, daemon=None):
super(StoppableThread, self).__init__(daemon=daemon)
self.__is_running = True
self.daemon = daemon
def terminate(self):
self.__is_running = False
def run(self):
pid = os.getpid()
counts = 0
while self.__is_running:
print(f'threading running: {pid} ran: {counts:04d} s')
counts += 1
time.sleep(1)
def call_thread():
thread = StoppableThread()
thread.daemon = True
thread.start()
pid = os.getpid()
counts = 0
for i in range(5):
print(f'0 call threading pid: {pid} ran: {counts:04d} s')
counts += 2
time.sleep(2)
# 主动把线程退出
thread.terminate()
if __name__ == '__main__':
call_thread()
print(f'==========call_thread finish===========')
counts = 0
for i in range(5):
counts += 1
time.sleep(1)
print(f'main thread:{counts:04d} s')
来源:https://blog.csdn.net/elegance_zf/article/details/49874959
0
投稿
猜你喜欢
- 1、项目背景对于不会PS的小伙伴,抠图是一个难度系数想当高的活儿,某宝照片抠图和证件照换底色均价都是5元RMB,所以今天要介绍的这款神工具,
- ……最近在学习yolo1、yolo2和yolo3,事实上它们和SSD网络有一定的相似性,我准备汇
- 持续更新一些常用的Tensor操作,比如List,Numpy,Tensor之间的转换,Tensor的拼接,维度的变换等操作。其它Tensor
- TensorFlow的日志级别分为以下三种:TF_CPP_MIN_LOG_LEVEL = 1 //默认设置,为显示所有信息TF_CPP_MI
- 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字
- 目录前言1 异常类型1.1 Python内置异常1.2 requests模块的相关异常1.3 用户自定义异常2. 异常捕获2.1&
- 我们今天就来看一下PHP 7正式版的算法和 wordpress 应用在其上的性能表现。PHP7 的安装,真是非常地向下兼容,下载,解压,把之
- 常见的图片加密方法包括加密算法、水印、隐藏、压缩等。下面简要介绍一些常见的图片加密方法:加密算法加密算法是一种基于数学运算的加密方式,可对图
- 如下所示:import wuhan.wuhan11class Han: def __init__(self, config):
- 在PyCharm 里,显示行号有两种办法:1,临时设置。右键单击行号处,选择 Show Line Numbers。但是这种方法,只对一个文件
- filecmp定义了两个函数,用于方便地比较文件与文件夹: filecmp.cmp(f1, f2[, shallow]): 比较两个文件的内
- 如下所示:beta分布的最大特点是其多样性, 从下图可以看出, beta分布具有各种形态, 有U形, 类似正态分布的形状, 类似unifor
- 一. 引言在数据分析和可视化领域,数据的有效呈现是至关重要的。Python作为一种强大的编程语言,提供了多种数据可视化工具和库。其中,Plo
- hashlib 模块hashlib 模块的介绍hashlib 模块中拥有很多的加密算法,我们并不需要关心加密算法的实现方法。只需要调用我们需
- 首先是三张表, CNo对应的是课程,在这里我就粘贴了。主表人名表按照常规查询SELECT s.SName, c.CName,s2.SCgra
- 问题你想使用一个简单的REST接口通过网络远程控制或访问你的应用程序,但是你又不想自己去安装一个完整的web框架。解决方案构建一个REST风
- JavaScript中的64位加密及解密的两个方法。function base64Encode(text){if (/(
- 前言在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景:我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么
- 我们通常可以使用os模块的命令进行执行cmd方法一:os.systemos.system(执行的命令)# 源码def system(*arg
- 后边要做一个微信小程序,并要能获取用户微信绑定的手机号码。而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返