python中停止线程的方法代码举例

 更新时间:2024年05月21日 11:09:18   作者:逻辑峰  
在Python中停止线程有多种方法,包括使用全局变量、使用标志位、使用异常等,下面这篇文章主要给大家介绍了关于python中停止线程方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1 threading.Event()方法

  • 一种常见的方法是使用标志位来通知线程应该停止。线程可以定期检查这个标志位,如果它被设置为停止,那么线程就结束其执行。下面是一个简单的例子:
import threading  
import time  
  
class MyThread(threading.Thread):  
    def __init__(self):  
        super(MyThread, self).__init__()  
        self.stop_event = threading.Event()  
  
    def run(self):  
    	# 清空设置
        self.stop_event.clear()
        while not self.stop_event.is_set():  
            print("Thread is running...")  
            time.sleep(1)  
  
    def stop(self):  
        self.stop_event.set()  
  
# 创建线程  
thread = MyThread()  
thread.start()  
  
# 在某个时间点,停止线程  
time.sleep(5)  
thread.stop()
  • 需要注意的是,这只是一种优雅的停止线程的方法,它依赖于线程在run方法中定期检查stop_event。如果线程没有这样的检查,或者它正在执行一个无法被中断的阻塞操作(例如IO操作),那么这种方法可能无法立即停止线程。

2 子线程抛出异常,立刻停止

  • Python中,使用ctypesPyThreadState_SetAsyncExc函数来在子线程中异步抛出一个异常是一种相对底层的做法,它可以直接在子线程的上下文中触发一个异常。然而,这种做法需要谨慎使用,因为它可能会导致线程状态不稳定或未定义的行为,特别是如果线程没有正确地处理异常。
import threading
import time
import ctypes
import inspect

def do_some_task():
    while True:
        time.sleep(1)
        print("子线程!1")
        time.sleep(1)
        print("子线程!2")
        time.sleep(1)
        print("子线程!3")
        time.sleep(1)
        print("子线程!4")
        time.sleep(1)
        print("子线程!5")

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

def stop_thread_now(thread):
    # 结束线程
    async_raise(thread.ident, SystemExit)

if __name__ == "__main__":
    # 可以在子线程任何时候随时结束子线程
    sub_thread = threading.Thread(target=do_some_task,name="sub_thread")
    sub_thread.start()
    print(sub_thread.is_alive())
    time.sleep(7)
    stop_thread_now(sub_thread)
    time.sleep(1)
    print(sub_thread.is_alive())

附:线程停止的最佳实践

在实际的应用中,我们应该遵循以下最佳实践来停止线程:

  • 使用标志位或Event对象来控制线程的停止,这样可以在线程执行的关键点进行安全的停止。
  • 在线程的代码中定期检查标志位或Event对象的状态,并根据状态决定是否退出循环。
  • 在主线程中修改标志位或Event对象的状态时,需要使用线程锁来保证线程安全性。
  • 避免使用Thread的stop()方法来终止线程的执行。

总结 

到此这篇关于python中停止线程方法的文章就介绍到这了,更多相关python停止线程方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中使用matplotlib模块errorbar函数绘制误差棒图实例代码

    Python中使用matplotlib模块errorbar函数绘制误差棒图实例代码

    在matplotlib中,errorbar方法用于绘制带误差线的折线图,下面这篇文章主要给大家介绍了关于Python中使用matplotlib模块errorbar函数绘制误差棒图的相关资料,需要的朋友可以参考下
    2022-08-08
  • python实现通过代理服务器访问远程url的方法

    python实现通过代理服务器访问远程url的方法

    这篇文章主要介绍了python实现通过代理服务器访问远程url的方法,涉及Python使用urllib模块操作URL的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Python图像处理之识别图像中的文字(实例讲解)

    Python图像处理之识别图像中的文字(实例讲解)

    今天小编就为大家分享一篇Python图像处理之识别图像中的文字(实例讲解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python+openCV调用摄像头拍摄和处理图片的实现

    python+openCV调用摄像头拍摄和处理图片的实现

    这篇文章主要介绍了python+openCV调用摄像头拍摄和处理图片的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 简单聊聊Python中多线程与类方法的交互

    简单聊聊Python中多线程与类方法的交互

    在Python编程中,多线程是一种提高程序运行效率的有效手段,本文将通过简洁的语言、清晰的逻辑和实际的代码案例,探讨Python多线程如何调用类方法,感兴趣的可以了解下
    2025-01-01
  • python多次绘制条形图的方法

    python多次绘制条形图的方法

    这篇文章主要为大家详细介绍了python多次绘制条形图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Python的UTC时间转换讲解

    Python的UTC时间转换讲解

    今天小编就为大家分享一篇关于Python的UTC时间转换讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python数据分析之绘制ppi-cpi剪刀差图形

    Python数据分析之绘制ppi-cpi剪刀差图形

    这篇文章主要介绍了Python数据分析之绘制ppi-cpi剪刀差图形,ppi-cp剪刀差是通过这个指标可以了解当前的经济运行状况,下文更多详细内容介绍需要的小伙伴可以参考一下
    2022-05-05
  • Python 用__new__方法实现单例的操作

    Python 用__new__方法实现单例的操作

    这篇文章主要介绍了Python 用__new__方法实现单例的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Python一文入门Flask Blueprint SQLAlchemy部分详解

    Python一文入门Flask Blueprint SQLAlchemy部分详解

    这篇文章主要为大家介绍了Python一文入门Flask Blueprint SQLAlchemy部分详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论