解决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 相关文章推荐
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
python中单例常用的几种实现方法总结
Oct 13 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
python:接口间数据传递与调用方法
Dec 17 Python
python基础梳理(一)(推荐)
Apr 06 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
django框架模板语言使用方法详解
Jul 18 Python
使用keras根据层名称来初始化网络
May 21 Python
python如何导入依赖包
Jul 13 Python
Python基本数据类型之字符串str
Jul 21 Python
详细介绍python操作RabbitMq
Apr 12 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
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
php递归实现无限分类的方法
2015/07/28 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
Python实现的批量下载RFC文档
2015/03/10 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python实现AdaBoost算法的示例
2020/10/03 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
小学科学教学计划
2015/01/21 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis