python子线程退出及线程退出控制的代码


Posted in Python onOctober 16, 2019

下面通过代码给大家介绍python子线程退出问题,具体内容如下所示:

def thread_func():
  while True:
      #do something
      #do something
      #do something
t=threading.Thread(target = thread_func)
t.start()
# main thread do something
# main thread do something
# main thread do something

跑起来是没有问题的,但是使用ctrl + c中断的时候出问题了,主线程退出了,但子线程仍然运行。

于是在主线程增加了信号处理的代码,收到sigint时改变子线程循环条件

loop = True
def thread_func():
  while loop:
      #do something
      #do something
      #do something
t=threading.Thread(target = thread_func)
t.start()
# ctrl+c时,改变loop为False
def handler(signum, frame):
  global loop
  loop = False
  t.join()
  exit(0)
signal(SIGINT, handler)
# main thread do something
# main thread do something
# main thread do something

这样ctrl+c就可以退出了,但是疑惑的是,主线程退出进程不会退出吗?

知识点扩展Python线程退出控制

ctypes模块控制线程退出

Python中threading模块并没有设计线程退出的机制,原因是不正常的线程退出可能会引发意想不到的后果。

例如:

线程正在持有一个必须正确释放的关键资源,锁。

线程创建的子线程,同时也将被杀掉。

管理自己的线程,最好的处理方式是拥有一个请求退出标志,这样每个线程依据一定的时间间隔检查规则,看是不是需要退出。

例如下面的代码:

import threading
class StoppableThread(threading.Thread):
  """Thread class with a stop() method. The thread itself has to check
  regularly for the stopped() condition."""

  def __init__(self):
    super(StoppableThread, self).__init__()
    self._stop_event = threading.Event()

  def stop(self):
    self._stop_event.set()

  def stopped(self):
    return self._stop_event.is_set()

这段代码里面,线程应该定期检查停止标志,在退出的时候,可以调用stop()函数,并且使用join()函数来等待线程的退出。

然而,可能会出现确实想要杀掉线程的情况,例如你正在封装一个外部库,它会忙于长时间调用,而你想中断它。

Python线程可以抛出异常来结束:

传参分别是线程id号和退出标识

def _async_raise(tid, exctype):
  '''Raises an exception in the threads with id tid'''
  if not inspect.isclass(exctype):
    raise TypeError("Only types can be raised (not instances)")
  res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,
                         ctypes.py_object(exctype))
  if res == 0:
    raise ValueError("invalid thread id")
  elif res != 1:
    # "if it returns a number greater than one, you're in trouble,
    # and you should call it again with exc=NULL to revert the effect"
    ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
    raise SystemError("PyThreadState_SetAsyncExc failed")

如果线程在python解释器外运行时,它将不会捕获中断,即抛出异常后,不能对线程进行中断。

简化后,以上代码可以应用在实际使用中来进行线程中断,例如检测到线程运行时常超过本身可以忍受的范围。

def _async_raise(tid, exctype):
  """raises the exception, performs cleanup if needed"""
  tid = ctypes.c_long(tid)
  if not inspect.isclass(exctype):
    exctype = type(exctype)
  res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
  if res == 0:
    raise ValueError("invalid thread id")
  elif res != 1:
    # """if it returns a number greater than one, you're in trouble,
    # and you should call it again with exc=NULL to revert the effect"""
    ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
    raise SystemError("PyThreadState_SetAsyncExc failed")
def stop_thread(thread):
  _async_raise(thread.ident, SystemExit)

总结

以上所述是小编给大家介绍的python子线程退出及线程退出控制的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
开源Web应用框架Django图文教程
Mar 09 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
python numpy库np.percentile用法说明
Jun 08 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
Python作用域和名称空间的详细介绍
Apr 13 Python
python Pillow图像处理方法汇总
Oct 16 #Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 #Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 #Python
python提取xml里面的链接源码详解
Oct 15 #Python
python yield关键词案例测试
Oct 15 #Python
python 发送json数据操作实例分析
Oct 15 #Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 #Python
You might like
PHP中for与foreach的区别分析
2011/03/09 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
项目建议书怎么写
2014/05/15 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
高考1977观后感
2015/06/04 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
python cv2图像质量压缩的算法示例
2021/06/04 Python
MySQL批量更新不同表中的数据
2022/05/11 MySQL