python 杀死一个线程
“不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协作并发,如果你使用强制手段干掉线程,那么很大几率出现意想不到的bug。”
话虽然这样说,但是有时候就有这样的需求,可以python本身没有提供这样的API,所以没办法在网上找了一圈,发现了两种方法。如下:
方法一:
利用setDaemon(True)这个函数的特性,特性如下:主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出。
但是如果要做到主线程不结束,但还是要强行结束子线程。所以我就突发奇想,如果我把要杀死的子线程看做是孙线程,给一个标志位给子线程,主线程改变标志位,子线程检查到就break自己,这样孙线程不就结束了,主线程仍在运行。然而,想法很美好。。。先上代码。
import threadingflag = 0
# 为线程定义一个函数
def print_time():def printOne():while 1:print(111111111111)print(222222222222)print(333333333333)print(444444444444)print(555555555555)print(666666666666)th1 = threading.Thread(target=printOne)th1.setDaemon(True)th1.start()while 1:if flag:print("正在停止这个程序!!!")break
i=5
if i == 5:th = threading.Thread(target=print_time)th.start()flag=1th.join()print("++++++++++++++++++++++++++++++++++++++++++++++++++")
while 1:pass
执行代码,会发现孙线程并没有结束。很简单,因为孙线程它会等主线程结束,它才结束。去掉最后两行代码,孙线程就会结束,但这也是等主线程结束的。所以方法一不满足需求。
方法二:
使用ctypes强行杀掉线程
import threading
import time
import inspect
import ctypesdef _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)def print_time():while 2:print(111111111111)print(222222222222)print(333333333333)print(444444444444)print(555555555555)print(666666666666)if __name__ == "__main__":t = threading.Thread(target=print_time)t.start()stop_thread(t)print("stoped")while 1:pass
这个方法是在网上找的,推荐一下,非常干净利索的干掉了子线程。
python 杀死一个线程相关推荐
- python杀死线程的方法_python杀死一个线程的方法
由于python线程没有提供abort方法,所以我们需要自己想办法解决此问题,面对这一问题,小编帮大家解决phthon杀死一个线程的方法 最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一 ...
- Java直接杀死线程方法_如何杀死一个线程?
1.简介 在这篇短文中,我们将讲述一下java中如果结束一个线程-事实上,这并没有想象中的那么简单,因为 Thread.stop()方法已经被废弃啦. 根据Oracle的解释,stop()方法可以导致 ...
- python2创建3个线程_用python创建一个线程需要多长时间
所以有两种方法可以解释你的问题: 其他在后台运行的线程(线程已经启动)是否会影响新线程的创建时间. 在这种情况下,不需要启动线程: import threading import time def f ...
- Python中的 线程
1. 线程定义 线程是操作系统调度的最小单位 它被包含在进程之中,是进程中的实际运作单位 进程本身是无法自己执行的,要操作cpu,必须创建一个线程,线程是一系列指令的集合 线程定义拓展 线程是操作系统 ...
- 用Python实现一个简单的线程池
线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收 ...
- python线程只能启动一次_python多线程只能运行一个线程的问题
问题描述: 使用 python threading.Thread() 建立两个线程,启动后只有线程1在运行,线程2不运行. 问题代码 import time, threading def run_th ...
- python apscheduler 阻塞方式只用一个线程_框架APScheduler在python中调度使用的实例详解...
本篇文章主要介绍了详解python调度框架APScheduler使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在研究python调度框架APScheduler使 ...
- python终止线程_Python里怎么终止一个线程
Python用sleep停止一个线程的运行,而不影响主线程的运行,案例代码如下: from threading import *import timeclass MyThread(Thread): d ...
- python线程暂停_在python中暂停一个线程和另一个线程
我正在研究如何在python中执行多线程(2个线程).在 我要他们中的一个一直在读串行端口.读取每个帧并将其保存到数据库中.我已经做了一个脚本来做这个.在 对于第二个,我希望它监听一个套接字端口.当它 ...
最新文章
- 动态主机配置协议服务器不能提供,计算机网络基础课程—动态主机配置协议(Dhcp)...
- python调用数据库存储过程_python连接mysql调用存储过程示例
- 薏米到底有多强大?真是没想到还能这样吃~
- Linux在多线程应用程序中处理信号
- 将jar文件加到Maven的local repository中
- warning: initialization from incompatible pointer type error, forbidden解决
- Java基础Arrays类
- Axure9.0元件库的使用
- vb程序设计基础笔记
- 360安全桌面壁纸被设为壁纸后的路径xp
- 【面试题】Java三大特性封装继承多态总结
- PLC控制系统设计与调试的一般步骤
- linux 查找py文件命令_Linux常用命令(一)
- 18获得触发事件元素节点的方法
- ambari 修改服务器名,ambari - Ambari无法运行用于修改用户配置单元的自定义钩子 - 堆栈内存溢出...
- [基础服务] [数据库] ClickHouse的安装和配置
- 深度解析—汽车“以租代购”究竟是怎么回事?
- 临床血液学检验仪器与技术
- 胡润区块链富豪榜公布,卖铲子卖水的最赚
- H5是HTML5的缩写吗?
热门文章
- python argsort排序结果_numpy.argsort()可以对元组或列表进行排序
- arcgis python 二次开发_我在部署ArcGIS API for Python时踩到的坑
- Openstack nova-scheduler 源码分析 — Filters/Weighting
- GD32的flash读、擦除、写操作
- 在C++项目中引入Lua(AlphaGo使用的方案)
- MySQL添加用户、删除用户与授权
- Uva592 Island of Logic
- microsoft .net framework专题汇总
- 桌面显示菜单图标下面的字搞起阴影了,怎么弄掉?
- 我想问一下为什么会开3分钟系统自动会从新启动呢?