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聊天室实现方法
Jun 28 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
python针对excel的操作技巧
Mar 13 Python
Python的argparse库使用详解
Oct 09 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
python ChainMap的使用和说明详解
Jun 11 Python
代码实例讲解python3的编码问题
Jul 08 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python线程信号量semaphore使用解析
Nov 30 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
python多线程方法详解
Jan 18 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
php微信公众平台开发类实例
2015/04/01 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
jQuery JSON的解析方式分享
2011/04/05 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
python实现linux下抓包并存库功能
2018/07/18 Python
详解python中eval函数的作用
2019/10/22 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
python怎么对数字进行过滤
2020/07/05 Python
管理信息系学生的自我评价
2014/01/11 职场文书
护士检查书
2014/01/17 职场文书
公司合作意向书
2014/04/01 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
升学宴来宾致辞
2015/07/27 职场文书
图书馆义工感想
2015/08/07 职场文书
小学班长竞选稿
2015/11/20 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书