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。

  • 相关阅读:
    C# String.Compare 方法测试
    C#checked 与 unchecked
    C#枚举类型
    C#结构体
    C越界和溢出的区别
    python/matlab : 将txt文件中的数据读为numpy数组
    matlab程序里调用python文件
    Python
    Pycharm调试及快捷键技巧
    Pycharm远程连接服务器debug时报错
  • 原文地址:https://www.cnblogs.com/rainduck/p/2989810.html
Copyright © 2011-2022 走看看