Python线程终止方法

python中停止线程的方法 虽然Python没有直接的方法来停止一个线程,但通过使用标志变量、守护线程或抛出异常,我们可以实现或模拟线程停止的行为。通常,使用标志变量是最灵活和最安全的方法。后续会持续更新分享相关内容,记得关注哦! 阅读详情
AI摘要

本文详细介绍了在Python中使用事件、线程状态和通过异常来终止线程的三种方法,分别展示了如何通过设置事件、改变线程状态以及在子线程中抛出异常来实现线程的终止。,

Python线程终止方法

Python线程终止有很多思路,本文介绍使用事件终止、状态终止和异常终止3种思路。事件终止和状态终止必须等待耗时任务结束后才能结束,异常终止可以立刻终止。

1 事件终止

借助线程种的事件,终止线程。

import ctypes
import inspect
import threading
import time


class StopThread(threading.Thread):
    def __init__(self):
        super().__init__()

        # 设置停止事件
        self.stop_event = threading.Event()

    def run(self):
        # 清空事件
        self.stop_event.clear()

        i = 0
        # 判断是否终止
        while not self.stop_event.is_set():
            i = i + 1
            print("Start=" + str(i))
            time.sleep(1)
            print("Task=" + str(i))
            time.sleep(1)
            print("end=" + str(i))
            print("====")

    # 终止线程
    def stop(self):
        self.stop_event.set()


def stop_thread_now(thread_id, except_type):
    """
    通过C语言的库抛出异常
    :param thread_id: 线程id
    :param except_type: 异常抛出类型
    :return:
    """
    # 在子线程内部抛出一个异常结束线程
    thread_id = ctypes.c_long(thread_id)
    if not inspect.isclass(except_type):
        except_type = type(except_type)
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(except_type))
    if res == 0:
        raise ValueError("线程id违法")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, None)
        raise SystemError("异常抛出失败")


if __name__ == '__main__':
    # 创建线程
    stop_thread = StopThread()
    stop_thread.start()
    time.sleep(3)

    # 停止线程,需要等待循环完成,不能立刻中断
    stop_thread.stop()

    # 停止线程,立刻终止
    # stop_thread_now(stop_thread.ident, SystemExit)

2 状态终止

状态终止的思路和事件终止思路相同。

import threading
import time


class StopThread(threading.Thread):
    def __init__(self):
        super().__init__()
        self.status = True

    def run(self):
        i = 0
        while self.status:
            i = i + 1
            print("Start=" + str(i))
            time.sleep(1)
            print("Task=" + str(i))
            time.sleep(1)
            print("end=" + str(i))
            print("====")

    # 终止线程
    def stop(self):
        self.status = False


if __name__ == '__main__':
    # 创建线程
    stop_thread = StopThread()
    stop_thread.start()

    # 停止线程,需要等待循环完成,不能立刻中断
    time.sleep(3)
    stop_thread.stop()

3 异常终止

import ctypes
import inspect
import threading
import time


def run_task(param_inner, update_task_inner):
    """
    运行任务
    :param param_inner: 输入的参数
    :param update_task_inner: 输入的方法,停止任务的回调函数
    :return:
    """
    print(param_inner)
    i = 0
    while True:
        i = i + 1
        print("Start=" + str(i))
        time.sleep(1)
        print("Task=" + str(i))
        time.sleep(1)
        print("end=" + str(i))
        # 回调方法,
        update_task_inner("finish=" + str(i))
        print("====")


def stop_thread_now(thread_id, except_type):
    """
    通过C语言的库抛出异常
    :param thread_id: 线程id
    :param except_type: 异常抛出类型
    :return:
    """
    # 在子线程内部抛出一个异常结束线程
    thread_id = ctypes.c_long(thread_id)
    if not inspect.isclass(except_type):
        except_type = type(except_type)
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(except_type))
    if res == 0:
        raise ValueError("线程id违法")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, None)
        raise SystemError("异常抛出失败")


def update_task(msg):
    print(msg)
    pass


if __name__ == '__main__':
    param = "test"
    task_thread = threading.Thread(
        # 运行的线程
        target=run_task,
        # 输入参数
        args=(param, update_task)
    )
    task_thread.start()

    time.sleep(4)

    # 立刻中断线程
    stop_thread_now(task_thread.ident, SystemExit)
Python中如何终止线程 "的信息,然后在主线程休眠5秒后,线程会输出"Thread stopped."的信息,主线程最后输出"Main thread stopped."的信息。在Python中,要终止线程,一种常见的方法是使用线程间的通信来告知线程停止执行。当标志变量为False时,线程会停止执行。在Python中,线程是轻量级的执行单元,可以同时执行多个任务。线程在每次循环迭代中都会检查标志变量的值,因此在线程执行过程中,我们需要确保线程可以正常退出循环。当我们希望终止线程时,只需要将标志变量设置为True即可。 阅读详情

相关推荐

Python中终止线程的方法

在Python编程中,线程是一种轻量级的执行单元,可以并发执行不同的任务。在实际应用中,我们应该谨慎使用该方法,并考虑使用其他方式来控制线程的执行。总结起来,本文介绍了在Python中终止线程的方法,并提供了相应的源代码示例。在编写多线程应用程序时,我们应该谨慎使用线程终止的方法,并考虑使用其他方式来控制线程的执行。要终止线程的执行,我们可以使用一些方法来控制线程的状态,使其停止执行。方法,用于定义线程的主要逻辑。在这个例子中,我们使用了一个无限循环来模拟线程执行任务的过程。方法,我们可以终止线程的执行。

NoerrorCode的博客 2007

Python多线程的结束

总结起来,这段代码的作用是关闭队列并等待队列中的元素被处理完毕,然后逐个等待线程执行完毕并终止线程的执行。队列中的所有元素被处理完毕。它会阻塞程序的执行,直到队列中的元素都被处理完毕才会继续往下执行。它会阻塞程序的执行,直到该线程执行完成后才会继续往下执行。它会强制停止正在执行的线程,并释放相关资源。然后,代码使用一个循环遍历线程列表。,表示不再向队列中添加新的元素。在循环内部,代码首先执行了。方法,这个方法是用来。

行子的博客 1498

保姆级教程:用STM32CubeMX HAL库搞定ESP8266连接,附串口printf调试全流程

本文提供了一份详细的STM32CubeMX HAL库教程,指导开发者如何实现ESP8266无线模块的连接与调试。从开发环境搭建、串口配置到AT指令通信解析,涵盖了物联网开发中的关键步骤和常见问题解决方案,帮助开发者快速掌握STM32与ESP8266的集成技术。

weixin_28273593的博客 504

python终止线程_Python中线程终止与挂起的实现方法

本篇文章给大家带来的内容是关于Python中线程终止与挂起的实现方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。线程没有任何方法可用于强制终止或挂起。这是设计上的原因,因为编写线程程序本身十分复杂。例如:如果某个线程已经获取了锁,在它能够释放锁之前强制终止或挂起它,将导致整个应用程序出现死锁。此外,终止时一般不能简单的【释放所有的锁】,因为复杂的线程同步经常涉及锁定和清楚锁定操...

weixin_39616477的博客 630

Nacos 2.3.2与PostgreSQL的Docker化部署实战

本文详细介绍了Nacos 2.3.2与PostgreSQL的Docker化部署实战,包括环境准备、数据库配置、镜像获取与导入、容器部署及常见问题排查。通过Docker容器化技术,结合PostgreSQL的稳定性和扩展性,为微服务架构提供高效的服务发现和配置管理解决方案。

k5l6m的博客 282

Zabbix-获取客户端的SNMP数据

网口状态(ifOperStatus)的 OID 是1.3.6.1.2.1.2.2.1.8,查询时需要用1.3.6.1.2.1.2.2.1.8.1(第 1 个网口)、1.3.6.1.2.1.2.2.1.8.2(第 2 个网口)等。表格对象是指 “包含多个同类实例的对象”(如设备的多个网口、多个进程等,每个实例需要单独标识)。在 SNMP 规范中,标量对象的完整 OID 必须以.0结尾,.0是标量对象的唯一实例编号。标量对象是指 “单一值的对象”(如设备的名称、温度、状态等,整个设备只需要一个值来表示)。

徐子元 1726

python结束线程_Python3-Threading之终止线程方法

#-*-coding:utf-8-*-import threadingimport timeimport inspectimport ctypesdef _async_raise(tid, exctype):"""raises the exception, performs cleanup if needed"""tid = ctypes.c_long(tid)if not inspect.isc...

weixin_39637370的博客 1780

人工智能之数学基础:弄懂数学本质,让我们不再害怕数学

数学的用途远远超过了人们的想象,甚至无处不在,任何领域都需要用到数学知识,人工智能也不例外。我将尽可能地将数学知识和机器学习算法相结合,让大家知道这些数学知识咋人工智能领域中的应用,使得数学的学习不会过于枯燥,同时也帮助大家扫清在学习算法过程中的数学障碍。除此之外,我还希望帮助大家建立一种不一样的数学思维,不再将数学看成是符号的演算、公式的推导,而是将数学看成是一种描述这个世界的工具,这样你就会发现这个世界处处有数学。当我们面对问题的时候,你是否会对问题进行抽象,然后通过数学来解决问题?

huanfeng_AI的博客 631

python run没了,如何在run方法中终止没有循环的Python线程?

Having class which has a long method.Creating a thread for that method.How i can kill\terminate this thread?Main problem is that i can't check for threading.Event in thread run() method because it doe...

weixin_42355865的博客 139

STM32G431的 FDCAN使用5M加速时,出现奇葩问题,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1636

calibre:将calibre 的layer number 转换为实际的laymer 名称(7)

可以使用与版图数据库配套的(Standard Verification Rule Format,标准验证规则格式),在 Calibre DESIGNrev 中加载图层名称。

u013620135的博客 984

Python线程的终止方法

a=M() a.start() print dir(a) import time time.sleep(3) import signala._Thread__stop() print a._Thread__stopped True | False

douyunqian668的博客 2万+

通过傅里叶变换进行音频变声变调

在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。

yang1fei2的博客 1815

python run没了_如何在run方法中终止没有循环的Python线程?

Having class which has a long method.Creating a thread for that method.How i can kill\terminate this thread?Main problem is that i can't check for threading.Event in thread run() method because it doe...

weixin_39976382的博客 211

红火蚁巢穴AI智能识别,提供方案与思路!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1041

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2018-11-28亲测有效的python线程终结,终止线程方法

import ctypes def _async_raise(tid, exctype): """raises the exception, performs cleanup if needed""" if not inspect.isclass(exctype): exctype = type(exctype) res = ctypes.pythonap...

zhuchuana的博客 881

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

python杀死线程的方法_多线程 – 防止线程subprocess.popen在子被杀死时终止我的主脚本?...

Solaris 10上的Python 2.7.3问题>当我的子进程有内部分段错误(核心)问题或用户使用SIGTERM或SIGKILL从shell外部杀死它时,我的主程序的信号处理程序处理SIGTERM(-15)并且我的父程序退出.这是真的吗?还是一个糟糕的python构建?背景和代码我有一个python脚本,首先产生一个工人管理线程.然后,工作线程管理线程生成一个或多个工作线程.我的主线程中还有其...

weixin_39857876的博客 266

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python判断线程结束_python爬虫如何取消或终止线程?

之前告诉大家,关于python爬虫的线程开展数据不是有限的,而是无穷的,因此,当我们在运行代码的时候,如果想要结束代码运行,要怎么处理呢?难道是直接拔了电源器嘛,总归有好的开始,就要给大家提供最简单的结束,因此,关于这部分内容,给大家整理了多种方法,供大家选择,一起来看下吧~三种线上方法l使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程终止;l使用 stop() 方法强行终止线程...

weixin_39969881的博客 706

python线程自我终止

Python相关视频讲解:python的or运算赋值用法用python编程Excel有没有用处?011_编程到底好玩在哪?查看python文件_输出py文件_cat_运行python文件_shel如何实现Python线程自我终止 1. 整体流程 首先,我们来看一下整个实现Python线程自我终止的流程: 步骤 ...

weixin_36606439的博客 120

python结束线程_python终止线程

可以通过以下方式来终止线程:通过抛出异常来终止进程通过一个终止标志来终止进程使用traces来终止进程使用多线程模型来终止进程通过将进程设置为deamon来终止进程使用隐藏属性_stop()通过抛出异常来终止进程# Python program raising# exceptions in a python# threadimport threadingimport ctypesimport ti...

weixin_39861918的博客 2415

python终止线程_python怎样终止线程?

原标题:python怎样终止线程?在python中启动和关闭线程:一、启动线程首先导入threadingimport threading然后定义一个方法def serial_read():......然后定义线程,target指向要执行的方法myThread = threading.Thread(target=serial_read)启动它myThread.start()二、停止线程import ...

weixin_28677005的博客 2635

linux python 终止线程,python如何终止线程

python终止线程的方法:1、调用stop函数,并使用join函数来等待线程合适地退出;2、在python线程里面raise一个Exception;3、用“thread.join”方式结束线程。本文操作环境:windows7系统、python3.5版,DELL G3电脑。前言 · 零我们知道,在python里面要终止一个线程,常规的做法就是设置/检查 --->标志或者锁方式来实现的。这种方...

weixin_28692817的博客 1296

python 多线程终止子线程

python相关学习资料:https://edu.51cto.com/video/3502.htmlhttps://edu.51cto.com/video/4102.htmlhttps://edu.51cto.com/video/3832.htmlPython多线程终止子线程的探索之旅 在Python编程中,多线程是...

weixin_28716181的博客 216

五种杀死子线程的方法

想看英文的可以点击这里 通常来说,突然杀死一个子线程往往不是一个好的选择。但是,在某些特定的场合,我们需要杀死子线程。下面介绍了五种不同的方法杀死子线程: Raising exceptions in a python thread Set/Reset stop flag Using traces to kill threads Using the multiprocessing module to kill threads Killing Python thread by setting it

oreo的博客 5045

python threading 结束线程

python threading 启动的线程,并没有提供终止线程的方法,现总结一下在网上找到的方法 1、通过threading.Thread._Thread__stop()结束线程 import time import threading def f(): while 1: time.sleep(0.1) print(1) t = thread...

fenglepeng的博客 3万+
上一篇: 将pyinstaller打包为exe文件
下一篇: 开源翻译大模型
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值