解决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之Import 模块
Oct 13 Python
详解Swift中属性的声明与作用
Jun 30 Python
Python之父谈Python的未来形式
Jul 01 Python
python中异常报错处理方法汇总
Nov 20 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
Python探索之Metaclass初步了解
Oct 28 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 Python
python后端接收前端回传的文件方法
Jan 02 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
用python实现一个简单的验证码
Dec 09 Python
python基于tkinter制作无损音乐下载工具
Mar 29 Python
Python数据分析之pandas读取数据
Jun 02 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
调频问题解答
2021/03/01 无线电
用来给图片加水印的PHP类
2008/04/09 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
C语言如何决定使用那种整数类型
2016/11/26 面试题
Ajax的工作原理
2015/12/04 面试题
十八大闭幕感言
2014/01/22 职场文书
工程师岗位职责规定
2014/02/26 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
出生证明范本
2015/06/15 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python