zoukankan      html  css  js  c++  java
  • python中threading方式创建的线程的终止

    对于采用threading方式创建的线程,没有提供推出的方法,只能是等线程函数结束。但是有些情况需要强制结束,这就比较麻烦了。

    有如下实现方式:

    import threading
    import inspect
    import ctypes 
    
    def _async_raise(tid, exctype):
        """raises the exception, performs cleanup if needed"""
        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)

    当然也可参考http://huangliangnumber1.blog.163.com/blog/static/4781174820114125404510/

    import threading  
    import inspect  
    import ctypes  
     
    def _async_raise(tid, exctype):
        """raises the exception, performs cleanup if needed"""
        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 Thread(threading.Thread):
        def _get_my_tid(self):
            """determines this (self's) thread id"""
            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
     
            raise AssertionError("could not determine the thread's id")
    def raise_exc(self, exctype):
            """raises the given exception type in the context of this thread"""
            _async_raise(self._get_my_tid(), exctype)
    def terminate(self):
            """raises SystemExit in the context of the given thread, which should 
            cause the thread to exit silently (unless caught)"""
            self.raise_exc(SystemExit)

    其实两者是一样的。需要注意的是在python2.6后threading.Thread中有变量ident直接作为线程id。

  • 相关阅读:
    WPF 实现窗体拖动
    CAP带你轻松玩转ASP.NETCore消息队列
    ASP.NET Core开发-获取所有注入(DI)服务
    k8s实战为aspnetcore.webapi微服务注入配置信息
    详解docker实战之搭建私有镜像仓库
    自己动手破解Z.EntityFramework.Extensions 4.0.11.0的方法
    可以获取随机图片的API收集 必应 等
    一键发布部署vs插件[AntDeploy],让net开发者更幸福
    比ngx_http_substitutions_filter_module 更强大的替换模块sregex的replace-filter-nginx-module
    编译nginx的源码安装subs_filter模块
  • 原文地址:https://www.cnblogs.com/rainduck/p/2989810.html
Copyright © 2011-2022 走看看