解决python父线程关闭后子线程不关闭问题


Posted in Python onApril 25, 2020

我们都知道,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')

以上这篇解决python父线程关闭后子线程不关闭问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现探测socket和web服务示例
Mar 28 Python
python将文本转换成图片输出的方法
Apr 28 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
python实现NB-IoT模块远程控制
Jun 20 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
python cumsum函数的具体使用
Jul 29 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
Pytorch之扩充tensor的操作
Mar 04 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
Python之matplotlib绘制折线图
Apr 13 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 #Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 #Python
python 追踪except信息方式
Apr 25 #Python
Python实现捕获异常发生的文件和具体行数
Apr 25 #Python
python IDLE添加行号显示教程
Apr 25 #Python
IDLE下Python文件编辑和运行操作
Apr 25 #Python
python 字典item与iteritems的区别详解
Apr 25 #Python
You might like
火车头采集器3.0采集图文教程
2007/03/17 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
在Django框架中运行Python应用全攻略
2015/07/17 Python
python中关于for循环的碎碎念
2017/06/30 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
python多线程实现TCP服务端
2019/09/03 Python
python 内置函数汇总详解
2019/09/16 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
python归并排序算法过程实例讲解
2020/11/04 Python
python复合条件下的字典排序
2020/12/18 Python
您的网上新华书店:文轩网
2016/08/24 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
应届生.NET方向面试题
2015/05/23 面试题
执行总经理岗位职责
2014/02/03 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
活动倡议书范文
2014/05/13 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
疾病防治方案
2014/05/31 职场文书
三八妇女节慰问信
2015/02/14 职场文书
父亲节寄语大全
2015/02/27 职场文书
办公室岗位职责范本
2015/04/11 职场文书
接待员岗位职责范本
2015/04/15 职场文书
关于倡议书的范文
2015/04/29 职场文书
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python