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阻塞的线程暂未找到合适的方法,如果哪位马油有方法,还原留言区讨论。
python如何强制结束主线程_强制结束线程相关推荐
- python 主程序等待 子线程_Python多线程中主线程等待所有子线程结束的方法
Python多线程中主线程等待所有子线程结束的方法 发布时间:2020-07-30 14:39:04 来源:亿速云 阅读:77 作者:小猪 这篇文章主要讲解了Python多线程中主线程等待所有子线程结 ...
- pthread线程传递数据回主线程_操作系统4:线程(1)
接下来讨论下线程.进程和线程是一个很有趣的话题,进程和线程的区别到底是什么?一些书上讲线程是"轻量级进程",从而可以节省切换开销.但是线程到底是怎么样成为轻量级进程的呢? 可以设想 ...
- 4.5.2.5_主线程_墨镜滤镜
4.5.2.5_主线程_墨镜滤镜 <!DOCTYPE html> <html><head><meta charset="UTF-8"> ...
- Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?
首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...
- 主线程等待所有子线程结束的4种方法
目录 主线程不等待子线程全部结束 1.使用CountDownLatch 2.同步屏障CyclicBarrier 2.1.CyclicBarrier使用 2.2.CyclicBarrier复用 2.3. ...
- 在主线程中为子线程解锁_在XP中为Google Chrome启用Vista黑色风格主题
在主线程中为子线程解锁 If you've seen the screenshots of Google Chrome on XP vs Vista, you've probably noticed ...
- Java多线程、主线程等待所有子线程执行完毕、共享资源
1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1 继承Thread类 public class myThread exte ...
- java主线程等待所有子线程执行完毕再执行
java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...
- java 父线程_Java父线程(或是主线程)等待所有子线程退出的实例
导读热词 实例如下: static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final ...
最新文章
- 查看Oracle数据库SQL执行历史
- Server Error: 0×80070543,无法取得服务器的状态(role 和 features)
- windows下apache报错The requested operation has failed解决方法
- 数据库高级知识——mysql架构介绍(二)
- Myeclipse10 整合SSH过程(巨详细!!!)及出错笔记
- 反卷积(转置卷积)的理解
- numpy 中的 broadcasting(广播)机制
- c语言填空题库,C语言题库(填空题部分)
- Redis5.0集群搭建(三主三从)、添加一主一从、JedisCluster连接集群
- c语言swap是什么,swap(什么是swap)
- 联想电脑白屏了按哪个键可以修复?
- android 小白点代码,Android实现小圆点显示未读功能
- 统一软件过程的基本概念
- javaweb中四大域对象的生命周期与常用方法
- 劳动法 第四章 工作时间和休息休假
- 串口通信数据位长度对传输数据的影响
- 机器视觉应用高光面产品瑕疵检测
- 量子计算机和光计算,杂谈|是量子计算,还是光学实验?
- LSC局域网屏幕监控系统
- 文本框透明CSS样式
热门文章
- 一级计算机B理论知识和答案,计算机一级B基础知识选择题答案.doc
- ioca0中断 pic单片机_关于PIC单片机的模块和功能总结
- php 文件指定位置添加内容,C++_VC++在TXT文件指定位置追加内容的方法,本文实例讲述了VC++操作文本文 - phpStudy...
- mysql多表添加怎么写_mysql多表连接的几种写法
- java的字节码无法显示_【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法...
- .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)
- 鬼才!用Python计算圆周率 π
- 大数据生态圈常用组件(二):概括介绍、功能特性、适用场景
- 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
- mysql 5.7 not null_mysql5.7基础 select...where...is not null 查找不为NULL的内容