python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python停止线程方法

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

作者:逻辑峰

在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()

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

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())

附:线程停止的最佳实践

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

总结 

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

您可能感兴趣的文章:
阅读全文