专栏首页python3如何杀死一个python的线程

如何杀死一个python的线程

“不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协作并发,如果你使用强制手段干掉线程,那么很大几率出现意想不到的bug。”

话虽然这样说,但是有时候就有这样的需求,可以python本身没有提供这样的API,所以没办法在网上找了一圈,发现了两种方法。如下:

方法一:

利用setDaemon(True)这个函数的特性,特性如下:主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出。

但是如果要做到主线程不结束,但还是要强行结束子线程。所以我就突发奇想,如果我把要杀死的子线程看做是孙线程,给一个标志位给子线程,主线程改变标志位,子线程检查到就break自己,这样孙线程不就结束了,主线程仍在运行。然而,想法很美好。。。先上代码。

import threading

flag = 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=1
      th.join()
      print("++++++++++++++++++++++++++++++++++++++++++++++++++")
while 1:
   pass

执行代码,会发现孙线程并没有结束。很简单,因为孙线程它会等主线程结束,它才结束。去掉最后两行代码,孙线程就会结束,但这也是等主线程结束的。所以方法一不满足需求。

方法二:

使用ctypes强行杀掉线程。

import threading
import time
import inspect
import ctypes

def _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

这个方法是在网上找的,推荐一下,非常干净利索的干掉了子线程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python --日期输出学习

    py3study
  • python3(元组,列表,集合,字典)

    1.列表 1)创建列表 数组:存储同一种数据类型的集合 scores=[12,13,14] 列表:(打了激素的数组):可以存储任意数据类型的集合

    py3study
  • Python基础入门视频课程——笔记

    视频课程链接:http://edu.51cto.com/course/14859.html

    py3study
  • Python OJ 从入门到入门基础练习 10 题

    OJ 是 Online Judge 系统的简称,用来在线检测程序源代码的正确性 1、天天向上的力量: 一年365天,以第1天的能力值为基数,记为1.0。当好好学...

    compassblog
  • Python全栈学习_day001知识点

    py3study
  • Python 三十大实践、建议和技巧

    【导读】2020年,你又立了什么新的 Flag?新一年,我们先为大家准备 30 个非常优秀的 Python 实践技巧。希望这些诀窍能在实际工作中帮助大家,并且学...

    AI科技大本营
  • Numpy 01

    py3study
  • Python2中文处理纪要

    俺踏月色而来
  • 5.逻辑分支

    YungFan
  • 38.python print函数

    python中内置函数我们使用的最频繁的莫过于print函数,重helloword开始,我们就一直在接触print,虽然使用简单,不过你真的会玩print函数吗...

    猿说编程[Python和C]

扫码关注云+社区

领取腾讯云代金券