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连接mysql数据库示例(做增删改操作)
Dec 31 Python
举例讲解Python中的list列表数据结构用法
Mar 12 Python
json跨域调用python的方法详解
Jan 11 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python实现飞机大战小游戏
Nov 08 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
python抓取网页中图片并保存到本地
2015/12/01 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Python OpenCV实现视频分帧
2019/06/01 Python
django框架cookie和session用法实例详解
2019/12/10 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
自我鉴定书范文
2013/10/02 职场文书
关于工资低的辞职信
2014/01/14 职场文书
先进工作者获奖感言
2014/02/08 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
销售人员工作自我评价
2014/09/21 职场文书
长城导游词
2015/01/30 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏