Python:线程之定位与销毁_python 线程销毁
找出线程ID
和平时的故障排查相似,先通过 ps 命令看看目标进程的线程情况,因为已经是 setName 设置过线程名,所以正常来说应该是看到对应的线程的。 直接用下面代码来模拟这个线程:
Python 版本的多线程

输出:

可以看到在 Python 里面输出的线程名就是我们设置的那样,然而 Ps 的结果却是令我怀疑人生:

正常来说不该是这样呀,我有点迷了,难道我一直都是记错了?用别的语言版本的多线程来测试下:
C 版本的多线程

输出:

用 PS 命令再次验证:

这个才是正确嘛,线程名确实是可以通过 Ps 看出来的嘛!
不过为啥 Python 那个看不到呢?既然是通过setName设置线程名的,那就看看定义咯:

看到这里其实只是在Thread对象的属性设置了而已,并没有动到根本,那肯定就是看不到咯~
这样看起来,我们已经没办法通过ps或者/proc/这类手段在外部搜索 python 线程名了,所以我们只能在 Python 内部来解决。
于是问题就变成了,怎样在 Python 内部拿到所有正在运行的线程呢?
threading.enumerate可以完美解决这个问题!Why?
Because 在下面这个函数的 doc 里面说得很清楚了,返回所有活跃的线程对象 ,不包括终止和未启动的。

因为拿到的是 Thread 的对象,所以我们通过这个能到该线程相关的信息!
请看完整代码示例:

输出:

代码看起来有点长,但是逻辑相当简单,Thread-test1和Thread-test2都是打印出当前的 pid、线程 id 和 线程名字,然后 3s 后退出,这个是想模拟线程正常退出。
而Checker线程则是每秒通过threading.enumerate输出当前进程内所有活跃的线程。
可以明显看到一开始是可以看到Thread-test1和Thread-test2的信息,当它俩退出之后就只剩下MainThread和Checker自身而已了。
销毁指定线程
既然能拿到名字和线程 id,那我们也就能干掉指定的线程了!
假设现在Thread-test2已经黑化,发疯了,我们需要制止它,那我们就可以通过这种方式解决了:
在上面的代码基础上,增加和补上下列代码:

一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。


二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典


简历模板
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
