python如何强制结束主线程_强制结束线程

场景: 如果某个线程持续阻塞,无法退出,从而导致整个程序无法结束,此时就需要强制结束线程

思路:由于程序阻塞,比如卡在代码中的某一行后,一直无法向下执行,此时,无法通过常规方式结束线程

方法1: 采用线程自己的方法强制结束  Thread._Thread__stop(thd_obj),此种方式的优点是可以强制结束在某一行代码处卡住或者正在运行的线程

注:此处的卡住指的是 线程正在发生io阻塞,此时,无法判断事件,只能在底层加超时处理机制或者采用此处的方式暴力结束,别无他法。

方法2: 使用ctypes的pythonapi接口结束线程,此种方式只能强制结束正在运行的线程而不报错,无法结束被卡主不动的线程,此种方式无法结束python3的线程

划重点:python私有变量表示在内的内部定义并使用,外部无法訪问,以双下划线作为前作,定义后被python转为

_classname__变量名

代码示例1:

importsysimporttimeimportinspectimportctypesimportplatformfrom datetime importdatetimefrom threading importThreaddef_async_raise(tid, exctype):"""raises the exception, performs cleanup if needed"""tid=ctypes.c_long(tid)if notinspect.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")defstop_thread(thd_obj):if platform.python_version() < '3':try:

Thread._Thread.__stop(thd_obj)

#Thread._Thread__stop(thd_obj) # 此种方法也可以

except:pass else: _async_raise(thd_obj.ident, SystemExit)classcommThread(Thread):def __init__(self, target=None, name=None, args=()): super(commThread, self).__init__() self.setName(str(name)) self.fn=target self.args=args self.result= '' defrun(self):print("begin run the child thread: %s" %self.name)whileTrue: time.sleep(1)try:ifself.fn: self.result= self.fn(*self.args)finally:pass defget_result(self):returnself.resultdefget_now_time():return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))def time_str_to_time(st_date, end_date, mod='%Y-%m-%d %H:%M:%S', to_hour=False, to_minute=False, to_second=True): st_date=datetime.strptime(st_date, mod) end_date=datetime.strptime(end_date, mod) time_interval= end_date -st_dateifto_second:returntime_interval.total_seconds()ifto_minute:return ifto_hour:return classA():def __init__(self):pass deftest_ret(self):return 'hello world' deftask1_fn(self, url):whileTrue: time.sleep(1000000)print (url + "FINISHED" +self.test_ret())deftimeout_check(self, st_time):whileTrue: diff=time_str_to_time(st_time, get_now_time())print('check time out is running, diff: %s.' %diff)if diff >= 5:breaktime.sleep(1)returnTrueif __name__ == '__main__': a=A() t1= commThread(target=a.task1_fn, args=('task1_fn',), name='task1_fn') st_time=get_now_time() t2= commThread(target=a.timeout_check, args=(st_time,), name='task2_fn') t1.start() t2.start()whileTrue: t2_result=t2.get_result()print('t2 result: %s' %t2_result)ift2_result:try: stop_thread(t1) stop_thread(t2)#Thread._Thread__stop(t1) #Thread._Thread__stop(t2) #except SystemError as sys_err: #print(sys_err) #except ValueError as val_err: #print(val_err) #except Exception as e: #print(e) except:pass breaktime.sleep(1)print('over .......') sys.exit()

代码示例2:

fromthreading import Thread

import timeclasscommThread(Thread):

def __init__(self, target=None, name=None, args=()):

super(commThread, self).__init__()

self.setName(str(name))

self.fn=target

self.args=args

self.result= ''def run(self):

print("begin run the child thread: %s" %self.name)whileTrue:

time.sleep(1)try:ifself.fn:

self.result= self.fn(*self.args)finally:

pass

def get_result(self):returnself.result

def kill(self):try:

self._Thread__stop()

except:

pass

def do_scan():whileTrue:

print('scan is running.....')

time.sleep(5)if __name__ == '__main__':for i in range(1):

t1= commThread(target=do_scan, name='do_scan')

t1.setDaemon(True)

t1.start()

t1.join(timeout=3)

print(t1.get_result())ift1.is_alive():

t1.kill()

print('over................')

示例2中充分运用了 setDaemon和join的作用:

1)setDaemon为True表示守护线程或者后台线程,主线程或者进程退出时,无需等待此线程完成,意义在于:避免子线程无限死循环导致无法退出程序,避免了孤儿进程的出现,设置为False刚好相反,会等待子线程执行完成;

2)join的作用是优先占用cpu资源。join中的timeout表示优先占用cpu资源的最大时长,如果没有设置,则一直等待直到子线程结束,如果设置了,则达到超时时间后,子线程自动退出。

关于强制结束线程的理解:

python中未提供强制结束线程的接口,原因是这样做并不安全,

理想的停止退出线程方法是 让线程自个自杀,所谓的线程自杀就是 我们给线程一个标志位,线程检测并满足标志位条件后自己退出。

python的线程不是模拟的,是真实的内核线程,内核调用pthread方法,但Python上层没有提供关闭线程的方法,这就需要我们自己把握了。

python结束线程的两种方法:

1) 退出标记

2) 使用ctypes强行杀掉线程

python3强制结束IO阻塞的线程暂未找到合适的方法,如果哪位马油有方法,还原留言区讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubectl apply -f_广州车展捷豹路虎参展阵容 全新F-PACE 路虎卫士90

近日&#xff0c;我们从相关渠道获得了捷豹路虎广州车展的阵容。将有两款新车亮相&#xff0c;新款捷豹F-PACE和路虎卫士90。新款捷豹F-PACE采用了最新的家族式设计风格&#xff0c;具有更时尚的造型设计&#xff0c;而路虎卫士90则拥有更短的轴距。外观方面&#xff1a;新款捷…

python 会议室预约系统解决方案_令令开门智能会议室预约系统解决方案

原标题&#xff1a;令令开门智能会议室预约系统解决方案在联合办公和中大型公司经常会发生会议室不够用的情况&#xff0c;这种不够用会给企业造成严重的影响&#xff1a;效率低下、部门间引发矛盾、重要会议受到打扰、增加人员成本等等。我们知道&#xff0c;一般邻近上下班是…

github gis 路径规划_Apollo问答丨车辆定位和轨迹规划用的是语义,还是3D Position?...

自Apollo开发者社区小程序上线以来&#xff0c;我们每一天都会在「社区问答」板块收到许多开发者的技术提问。每周&#xff0c;可爱的Apollo小姐姐都会精选出被采纳的社区问答进行整理汇总&#xff0c;并统一对大家进行答复。开发者在使用Apollo平台过程中&#xff0c;如果遇到…

python 安卓app开发环境搭建_基于react-native的APP开发环境配置

1. 首先要有jdk 版本1.8 环境变量必须要有 %JAVA_HOME%;%JAVA_HOME%\bin2.python 版本2 必须是python2(官方文档这么写的&#xff0c;具体不知道为啥) 环境变量两个 python根目录和scripts目录&#xff1b; 这边顺便提一嘴&#xff0c;win下python2与python3的共存…

astar插件下载 就行_暗黑破坏神2地图插件常用的设置,做自己的私人订制游戏!...

暗黑2是一款很老的游戏&#xff0c;虽然很经典&#xff0c;但游戏里有很多地方在今天看来有很多不方便的地方&#xff0c;比如无法查看怪物的一些属性&#xff0c;小地图上没有怪物显示&#xff0c;装备系统很复杂但一些数值不能直接查看比如物品等级。所以如今很多朋友玩这个游…

什么是驻点和拐点_拐点和驻点的区别有哪些

各位家长好&#xff0c;我是51学霸(51xueba.cn)专栏作者&#xff0c;甜老师全文共计758字&#xff0c;建议阅读2分钟拐点&#xff1a;二阶导数为零&#xff0c;且三阶导不以零&#xff1b;驻点&#xff1a;一阶导数为零或不会有。差别&#xff1a;可导涵数f(x)的极值点【必然】…

asp.net 将bmp格式图片怎么转换为jpg_Heic图片转换精灵-Heic图片高清转换JPG/PNG/BMP方法...

想打开heic文件&#xff0c;首先要做的是把图片格式转换成电脑可以查看的&#xff0c;电脑可以查看的形式也并非很单一&#xff0c;比如jpg/bmp/png&#xff0c;这些都是比较常用的格式&#xff0c;首先heic图片是苹果手机独有的图片格式&#xff0c;电脑上或者其他设备是无法打…

beaninfo详解源码解析 java_Java后端精选技术:源码解析Spring Cloud Zuul

Zuul 架构图在zuul中&#xff0c; 整个请求的过程是这样的&#xff0c;首先将请求给zuulservlet处理&#xff0c;zuulservlet中有一个zuulRunner对象&#xff0c;该对象中初始化了RequestContext&#xff1a;作为存储整个请求的一些数据&#xff0c;并被所有的zuulfilter共享。…

一加到1亿。C语言_可能是今年最难选的2部手机:小米10详细对比一加8T

原标题&#xff1a;可能是今年最难选的2部手机&#xff1a;小米10详细对比一加8T在智能手机行业里流传着这样一句话&#xff1a;旗舰处理器只能决定一款机型的下限&#xff0c;而不能决定它的上限&#xff1b;决定一款机型上限的是旗舰处理器之外的屏幕、拍照、UI等等。这句话放…

html5 webrtc fir 请求关键帧_中信建投官网强调认可我们的投资理念的股民朋友请求 CTRL D 收藏、锁定本直播地址...

本文摘要&#xff1a;有关中信建投官网强调认可我们的投资理念的股民朋友请求 CTRL D 收藏、锁定本直播地址的内容分享&#xff0c;跟踪了解如何看股票k线图&#xff0c;分享热点专题。欢迎来到 橘子股票直播间&#xff0c;本直播每日为大家更新最快、最精准、最全面的股市内容…

打印完全二叉树java_java 完全二叉树的构建与四种遍历方法示例

本来就是基础知识&#xff0c;不能丢的太干净&#xff0c;今天竟然花了那么长的时间才写出来&#xff0c;记一下。有如下的一颗完全二叉树&#xff1a;先序遍历结果应该为&#xff1a;1 2 4 5 3 6 7中序遍历结果应该为&#xff1a;4 2 5 1 6 3 7后序遍历结果应该为…

模拟 http connecttimeout_燃烧室数学模型模拟软件NPSS

燃烧室的各个结构都可以被建立数学模型用矩阵进行模拟计算&#xff0c;每个模型都由输入、定义各部件的参数以及输出组成。流体在系统中某个点的状态可以由速率、压力、温度和构成(例如铝粉和氢气的质量比例)等参数描述。由于各个参数之间存在反馈环路&#xff0c;导致输入和输…

两个时间点距离 time_t c_天津二建公路考试时间

天津二建公路考试时间 Vadg42d天津二建公路考试时间 预警体系通过预警分析和预控对策实现事故的预警和控制&#xff0c;预警分析完成监测、识别、诊断与评价功能&#xff0c;而预控对策完成对事故征兆的不良趋势进行纠错和治错的功能。技术方案现金流量表主要有投资现金流量表&…

java 168转换成861_java实验-java语言面向对象编程基础

java实验-java语言面向对象编程基础 (12页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;8.90 积分广州大学学生实验报告广州大学学生实验报告开课学院及实验室&#xff1a;开课学院及实验室&#xf…

c#养老院老人信息管理系统源码 论文_辽宁吃的好的社区养老院位置,爱心养老院_抚顺市望花区社会养老中心...

首页 > 新闻中心发布时间&#xff1a;2020-11-09 02:11:16 导读&#xff1a;抚顺市望花区社会养老中心为您提供辽宁吃的好的社区养老院位置,爱心养老院的相关知识与详情&#xff1a; 老人早晨气场后手指经常发硬&#xff0c;无法自己握拳。 老人关节活动不方便&#xff0c;活…

名片识别信息分类python_python体验名片识别OCR

我想使用名片识别OCR&#xff0c;主要研究了腾讯云的智能映像和腾讯Youtu.解析后的汉字直接是unicode&#xff0c;例如u\ u90e8 \ u95e8 \ u526f \ u603b \ u7ecf \ u7406&#xff0c;根据腾讯的文档&#xff0c;代码经验:首先&#xff0c;介绍一下.import timeimport randomim…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

python3单例-python3如何运行文件夹python单例模式

单例模式是一种常用的软件设计模式. 在单例模式的核心结构中,只包含一个被称为单例类的特殊类. 通过单例模式可以保证系统中一个类只有一个实例,而且这个实例可以轻易被外界访问,方便控制实例对象的个数以节约系统资源. 单例模式是解决一个系统中某个类的实例化对象有且只能有一…

python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)

标签&#xff1a;1、序列化&#xff1a;以下代码在对象过大时会报错&#xff1a;进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值。//jsonObj比较大的时候会报错var serializer new JavaScriptSerializer();return serializer.Serialize(jsonOb…

native 真机测试react_react-native真机调试出现Failed to install all

使用的魅蓝note手机进行调试&#xff0c;没有想到就出现这个问题了。错误信息&#xff1a;Installing APK app-debug.apk on m1 note - 5.1 for app:debugUnable to install H:\ReactN\one\android\app\build\outputs\apk\app-debug.apkcom.android.ddmlib.InstallException: F…