• 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。

  • 相关阅读:
    LeetCode 224. 基本计算器 栈 双指针
    LeetCode 150. 逆波兰表达式求值 栈
    LeetCode 387. 字符串中的第一个唯一字符 哈希
    LeetCode 316. 去除重复字母 栈 哈希
    LeetCode 44. 通配符匹配 dp
    禁止屏幕旋转并同时解决以至于导致Activity重启的方法
    让振动器振动起来——Vibrator的使用
    简单的JDBC封装
    js jquery ajax 清除ie下的缓存问题
    angular.js 下拉框选中 根据后台返回值
  • 原文地址:https://www.cnblogs.com/rainduck/p/2989810.html
Copyright © 2020-2023  润新知