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 相关文章推荐
web.py获取上传文件名的正确方法
Aug 26 Python
Python生成随机MAC地址
Mar 10 Python
Python代码实现KNN算法
Dec 20 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
python+tkinter实现学生管理系统
Aug 20 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
PyTorch实现AlexNet示例
Jan 14 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
Pytorch中的数据集划分&正则化方法
May 27 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
类的另类用法--数据的封装
2006/10/09 PHP
php+oracle 分页类
2006/10/09 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
js实现数字滚动特效
2019/12/16 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
详解React 元素渲染
2020/07/07 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
安全生产宣传标语
2014/06/06 职场文书
语文教育专业求职信
2014/06/28 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
党员个人党性分析材料
2014/12/18 职场文书
单位介绍信格式范文
2015/05/04 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
2015年工商所工作总结
2015/05/21 职场文书
狂人日记读书笔记
2015/06/30 职场文书
消防安全培训工作总结
2015/10/23 职场文书
六年级作文之关于梦
2019/10/22 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
JAVA API 实用类 String详解
2021/10/05 Java/Android
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers