解决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进程管理工具supervisor使用实例
Sep 17 Python
Python的Flask框架与数据库连接的教程
Apr 20 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
详解Django rest_framework实现RESTful API
May 24 Python
python实现归并排序算法
Nov 22 Python
python调试神器PySnooper的使用
Jul 03 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
Python for循环及基础用法详解
Nov 08 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Python实现上下文管理器的方法
Aug 07 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 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
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP7新功能总结
2019/04/14 PHP
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
js快速排序的实现代码
2013/12/08 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
python树莓派红外反射传感器
2019/01/21 Python
谈谈Python中的while循环语句
2019/03/10 Python
python如何代码集体右移
2020/07/20 Python
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
四风自我剖析材料思想汇报
2014/10/01 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
银行求职信模板
2015/03/20 职场文书
保研专家推荐信范文
2015/03/25 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技