iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python怎么终止线程
  • 670
分享到

python怎么终止线程

2023-06-06 16:06:12 670人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要为大家展示了python怎么终止线程,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Python怎么终止线程”这篇文章吧。python是什么意思Python是一种跨平台的、具有解释性、编

这篇文章主要为大家展示了python怎么终止线程,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Python怎么终止线程”这篇文章吧。

python是什么意思

Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。

python终止线程的方法:1、调用stop函数,并使用join函数来等待线程合适地退出;2、在python线程里面raise一个Exception;3、用“thread.join”方式结束线程。

前言 · 零

我们知道,在python里面要终止一个线程,常规的做法就是设置/检查 --->标志或者锁方式来实现的。

这种方式好不好呢?

应该是不大好的!因为在所有的程序语言里面,突然地终止一个线程,这无论如何都不是一个好的设计模式

同时

有些情况下更甚,比如:

  • 线程打开一个必须合理关闭的临界资源时,比如打开一个可读可写的文件;

  • 线程已经创建了好几个其他的线程,这些线程也是需要被关闭的(这可存在子孙线程游离的风险啊!)。

简单来说,就是我们一大群的线程共线了公共资源,你要其中一个线程“离场”,假如这个线程刚好占用着资源,那么强制让其离开的结局就是资源被死了,大家都拿不到了!怎么样是不是有点类似修仙类小说的情节!

知道为啥threading仅有start而没有end不?

你看,线程一般用在网络连接、释放系统资源、dump流文件,这些都跟IO相关了,你突然关闭线程那这些
没有合理地关闭怎么办?是不是就是给自己造bug呢?啊?!

因此这种事情中最重要的不是终止线程而是线程的清理啊。

解决方案 · 壹

一个比较nice的方式就是每个线程都带一个退出请求标志,在线程里面间隔一定的时间来检查一次,看是不是该自己离开了!

import threadinGClass StoppableThread(threading.Thread):    """Thread class with a stop() method. The thread itself has to check    regularly for the stopped() condition."""    def __init__(self):        super(StoppableThread, self).__init__()        self._stop_event = threading.Event()    def stop(self):        self._stop_event.set()    def stopped(self):        return self._stop_event.is_set()

在这部分代码所示,当你想要退出线程的时候你应当显示调用stop()函数,并且使用join()函数来等待线程合适地退出。线程应当周期性地检测停止标志。

然而,还有一些使用场景中你真的需要kill掉一个线程:比如,当你封装了一个外部库,但是这个外部库在长时间调用,因此你想中断这个过程。

【推荐:python视频教程

解决方案 · 貳

接下来的方案是允许在python线程里面raise一个Exception(当然是有一些限制的)。

def _async_raise(tid, exctype):    '''Raises an exception in the threads with id tid'''    if not inspect.isclass(exctype):        raise TypeError("Only types can be raised (not instances)")    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, 0)        raise SystemError("PyThreadState_SetAsyncExc failed")class ThreadWithExc(threading.Thread):    '''A thread class that supports raising exception in the thread from       another thread.    '''    def _get_my_tid(self):        """determines this (self's) thread id        CAREFUL : this function is executed in the context of the caller        thread, to get the identity of the thread represented by this        instance.        """        if not self.isAlive():            raise threading.ThreadError("the thread is not active")        # do we have it cached?        if hasattr(self, "_thread_id"):            return self._thread_id        # no, look for it in the _active dict        for tid, tobj in threading._active.items():            if tobj is self:                self._thread_id = tid                return tid        # TODO: in python 2.6, there's a simpler way to do : self.ident        raise AssertionError("could not determine the thread's id")    def raiseExc(self, exctype):        """Raises the given exception type in the context of this thread.        If the thread is busy in a system call (time.sleep(),        Socket.accept(), ...), the exception is simply ignored.        If you are sure that your exception should terminate the thread,        one way to ensure that it works is:            t = ThreadWithExc( ... )            ...            t.raiseExc( SomeException )            while t.isAlive():                time.sleep( 0.1 )                t.raiseExc( SomeException )        If the exception is to be caught by the thread, you need a way to        check that your thread has caught it.        CAREFUL : this function is executed in the context of the        caller thread, to raise an excpetion in the context of the        thread represented by this instance.        """        _async_raise( self._get_my_tid(), exctype )

正如注释里面描述,这不是啥“灵丹妙药”,因为,假如线程在python解释器之外busy,这样子的话终端异常就抓不到啦~

这个代码的合理使用方式是:让线程抓住一个特定的异常然后执行清理操作。这样的话你就能终端一个任务并能合适地进行清除。

解决方案 · 叁

假如我们要做个啥事情,类似于中断的方式,那么我们就可以用thread.join方式。

join的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的join函数。先看看这个:1. 阻塞主进程,专注于执行多线程中的程序。2. 多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个。3. 无参数,则等待到该线程结束,才开始执行下一个线程的join。4. 参数timeout为线程的阻塞时间,如 timeout=2 就是罩着这个线程2s 以后,就不管他了,继续执行下面的代码。
coding: utf-8# 多线程joinimport threading, time  def doWaiting1():      print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"      time.sleep(3)      print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" def doWaiting2():      print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"       time.sleep(8)      print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"  tsk = []    thread1 = threading.Thread(target = doWaiting1)  thread1.start()  tsk.append(thread1)thread2 = threading.Thread(target = doWaiting2)  thread2.start()  tsk.append(thread2)print 'start join: ' + time.strftime('%H:%M:%S') + "\n"   for tt in tsk:    tt.join()print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

默认join方式,也就是不带参,阻塞模式,只有子线程运行完才运行其他的。

两个线程在同一时间开启,join 函数执行。

waiting1 线程执行(等待)了3s 以后,结束。

waiting2 线程执行(等待)了8s 以后,运行结束。

join 函数(返回到了主进程)执行结束。

这里是默认的join方式,是在线程已经开始跑了之后,然后再join的,注意这点,join之后主线程就必须等子线程结束才会返回主线。

join的参数,也就是timeout参数,改为2,即join(2),那么结果就是如下了:

  1. 两个线程在同一时间开启,join 函数执行。

  2. wating1 线程在执行(等待)了三秒以后,完成。

  3. join 退出(两个2s,一共4s,36-32=4,无误)。

  4. waiting2 线程由于没有在 join 规定的等待时间内(4s)完成,所以自己在后面执行完成。

join(2)就是:我给你子线程两秒钟,每个的2s钟结束之后我就走,我不会有丝毫的顾虑!

以上就是关于“python怎么终止线程”的内容,如果改文章对你有所帮助并觉得写得不错,劳请分享给你的好友一起学习新知识,若想了解更多相关知识内容,请多多关注编程网Python频道。

--结束END--

本文标题: python怎么终止线程

本文链接: https://www.lsjlt.com/news/247826.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python怎么终止线程
    这篇文章主要为大家展示了python怎么终止线程,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“python怎么终止线程”这篇文章吧。python是什么意思Python是一种跨平台的、具有解释性、编...
    99+
    2023-06-06
  • Python线程的终止方法
    a=M() a.start() print dir(a) import time time.sleep(3) import signala._Thread__stop() print a._Thread__stopped True | F...
    99+
    2023-01-31
    线程 方法 Python
  • Python多线程之线程创建和终止
    python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。但是python(c...
    99+
    2023-01-31
    线程 多线程 Python
  • python终止线程的方法是什么
    Python 中终止线程的方法有以下几种:1. 使用标志位:在线程内部使用一个标志位来控制线程是否继续执行。当标志位为 False ...
    99+
    2023-09-25
    python
  • C#怎么优雅地终止线程
    今天小编给大家分享一下C#怎么优雅地终止线程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求说明现在有一个需求:有一个后台...
    99+
    2023-07-05
  • 怎么在Java中终止一个线程
    这篇“怎么在Java中终止一个线程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么在Java中终止一个线程”文章吧。Thr...
    99+
    2023-07-05
  • python终止线程的方法有哪些
    Python中终止线程的方法有以下几种:1. 使用标志位:在线程运行的过程中,通过设置一个标志位来控制线程的终止。在线程中通过检查标...
    99+
    2023-08-11
    python
  • java两阶段终止线程怎么实现
    这篇文章主要讲解了“java两阶段终止线程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java两阶段终止线程怎么实现”吧!一、怎么优雅地关闭一个线程?在一个线程T1中如何优雅地关闭...
    99+
    2023-06-25
  • python里怎么终止程序的执行
    如果你是在程序中让其自动退出,则可以使用: 1 exit() quit()   exit()   执行到此命令时,程序终止。 如果是程序陷入死循环,想强制结束,则按Ctrl + C。   //这个特别关键 ...
    99+
    2023-01-31
    程序 python
  • python怎么停止子线程
    在Python中,无法直接停止子线程。但可以通过设置一个标志位,在子线程中定期检查该标志位,以判断是否停止线程。以下是一个示例代码:...
    99+
    2023-09-04
    python
  • Java线程终止实例分析
    这篇文章主要介绍了Java线程终止实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java线程终止实例分析文章都会有所收获,下面我们一起来看看吧。题目解析答案选CA:线程使用sleep()方法,使线程挂起...
    99+
    2023-06-30
  • C++多线程强制终止详细
    目录前言: 故事的起因来源于我在优化他人c++源码的时候,想通过多线程的方式提升程序的运算效率,主要存在以下需求和难点: 多个线程并行跑模型,看哪个模型跑的快,跑出来后结束...
    99+
    2024-04-02
  • python怎么终止while循环
    在Python中,可以使用break关键字来终止while循环。当break关键字被执行时,程序会立即退出while循环,并且继续执...
    99+
    2023-08-25
    python
  • Java 终止线程的几种方式
    一、正常运行结束 所谓正常运行结束,就是程序正常运行结束,线程自动结束。 public class ThreadTest extends Thread { public void run() ...
    99+
    2023-08-31
    java jvm 开发语言
  • 怎么在java中利用全局变量终止线程
    这期内容当中小编将会给大家带来有关怎么在java中利用全局变量终止线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-15
  • Java中终止线程的方法详解
    Java中终止线程的方式主要有三种:使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃。...
    99+
    2023-05-31
    java 终止线程 ava
  • Java线程在什么情况下可以终止
    目录线程结束的三个原因具体分析1、使用标志位推出线程2、使用stop方法强制终止线程3、使用interrupt终止线程哪些情况可以终止线程的进行 题目解析 答案选C A:线程使用s...
    99+
    2024-04-02
  • Java语言多线程终止中的守护线程实例
    Java中线程分为两种类型:用户线程和守护(服务)线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程;不设置则默认为用户线程。结束单线程用 Thread.i...
    99+
    2023-05-30
  • 如果父进程终止则终止 exec
    哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《如果父进程终止则终止 exec》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面...
    99+
    2024-04-04
  • Java线程生命周期的终止与复位怎么实现
    这篇文章主要介绍“Java线程生命周期的终止与复位怎么实现”,在日常操作中,相信很多人在Java线程生命周期的终止与复位怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程生命周期的终止与复位怎...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作