解决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中的多线程实例教程
Aug 27 Python
python处理二进制数据的方法
Jun 03 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
Flask之flask-session的具体使用
Jul 26 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
解决pip install psycopg2出错问题
Jul 09 Python
python通过函数名调用函数的几种场景
Sep 23 Python
python从Oracle读取数据生成图表
Oct 14 Python
python爬虫请求头的使用
Dec 01 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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中如何直接执行SHELL
2013/06/28 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
JS打印gridview实现原理及代码
2013/02/05 Javascript
javascript数组的使用
2013/03/28 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
Javascript继承机制详解
2017/05/30 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
python之import机制详解
2014/07/03 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
利用python计算时间差(返回天数)
2019/09/07 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
公务员培训心得体会
2013/12/28 职场文书
餐厅经理岗位职责范本
2014/02/17 职场文书
团日活动总结模板
2014/06/25 职场文书
员工安全责任书范本
2014/07/24 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
解析MySQL binlog
2021/06/11 MySQL