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模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
python实现杨氏矩阵查找
Mar 02 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
django框架ModelForm组件用法详解
Dec 11 Python
Python log模块logging记录打印用法解析
Jan 20 Python
python3中sorted函数里cmp参数改变详解
Mar 12 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 Python
python实现canny边缘检测
Sep 14 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 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生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
jqTransform美化表单
2015/10/10 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
JS实现简单打字测试
2020/06/24 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python向图片里添加文字
2019/11/26 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
文化建设工作方案
2014/05/12 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
Python实现socket库网络通信套接字
2021/06/04 Python
Java对文件的读写操作方法
2022/04/29 Java/Android