“不要试图用强制方法杀掉一个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 杀死一个线程相关推荐

  1. python杀死线程的方法_python杀死一个线程的方法

    由于python线程没有提供abort方法,所以我们需要自己想办法解决此问题,面对这一问题,小编帮大家解决phthon杀死一个线程的方法 最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一 ...

  2. Java直接杀死线程方法_如何杀死一个线程?

    1.简介 在这篇短文中,我们将讲述一下java中如果结束一个线程-事实上,这并没有想象中的那么简单,因为 Thread.stop()方法已经被废弃啦. 根据Oracle的解释,stop()方法可以导致 ...

  3. python2创建3个线程_用python创建一个线程需要多长时间

    所以有两种方法可以解释你的问题: 其他在后台运行的线程(线程已经启动)是否会影响新线程的创建时间. 在这种情况下,不需要启动线程: import threading import time def f ...

  4. Python中的 线程

    1. 线程定义 线程是操作系统调度的最小单位 它被包含在进程之中,是进程中的实际运作单位 进程本身是无法自己执行的,要操作cpu,必须创建一个线程,线程是一系列指令的集合 线程定义拓展 线程是操作系统 ...

  5. 用Python实现一个简单的线程池

    线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收 ...

  6. python线程只能启动一次_python多线程只能运行一个线程的问题

    问题描述: 使用 python threading.Thread() 建立两个线程,启动后只有线程1在运行,线程2不运行. 问题代码 import time, threading def run_th ...

  7. python apscheduler 阻塞方式只用一个线程_框架APScheduler在python中调度使用的实例详解...

    本篇文章主要介绍了详解python调度框架APScheduler使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在研究python调度框架APScheduler使 ...

  8. python终止线程_Python里怎么终止一个线程

    Python用sleep停止一个线程的运行,而不影响主线程的运行,案例代码如下: from threading import *import timeclass MyThread(Thread): d ...

  9. python线程暂停_在python中暂停一个线程和另一个线程

    我正在研究如何在python中执行多线程(2个线程).在 我要他们中的一个一直在读串行端口.读取每个帧并将其保存到数据库中.我已经做了一个脚本来做这个.在 对于第二个,我希望它监听一个套接字端口.当它 ...

最新文章

  1. 动态主机配置协议服务器不能提供,计算机网络基础课程—动态主机配置协议(Dhcp)...
  2. python调用数据库存储过程_python连接mysql调用存储过程示例
  3. 薏米到底有多强大?真是没想到还能这样吃~
  4. Linux在多线程应用程序中处理信号
  5. 将jar文件加到Maven的local repository中
  6. warning: initialization from incompatible pointer type error, forbidden解决
  7. Java基础Arrays类
  8. Axure9.0元件库的使用
  9. vb程序设计基础笔记
  10. 360安全桌面壁纸被设为壁纸后的路径xp
  11. 【面试题】Java三大特性封装继承多态总结
  12. PLC控制系统设计与调试的一般步骤
  13. linux 查找py文件命令_Linux常用命令(一)
  14. 18获得触发事件元素节点的方法
  15. ambari 修改服务器名,ambari - Ambari无法运行用于修改用户配置单元的自定义钩子 - 堆栈内存溢出...
  16. [基础服务] [数据库] ClickHouse的安装和配置
  17. 深度解析—汽车“以租代购”究竟是怎么回事?
  18. 临床血液学检验仪器与技术
  19. 胡润区块链富豪榜公布,卖铲子卖水的最赚
  20. H5是HTML5的缩写吗?

热门文章

  1. python argsort排序结果_numpy.argsort()可以对元组或列表进行排序
  2. arcgis python 二次开发_我在部署ArcGIS API for Python时踩到的坑
  3. Openstack nova-scheduler 源码分析 — Filters/Weighting
  4. GD32的flash读、擦除、写操作
  5. 在C++项目中引入Lua(AlphaGo使用的方案)
  6. MySQL添加用户、删除用户与授权
  7. Uva592 Island of Logic
  8. microsoft .net framework专题汇总
  9. 桌面显示菜单图标下面的字搞起阴影了,怎么弄掉?
  10. 我想问一下为什么会开3分钟系统自动会从新启动呢?