def async_raise(self, exc_type):
    """Raise the exception."""
    # Should only be called on a started thread, so raise otherwise.
    assert self.ident is not None, 'Only started threads have thread identifier'

    # If the thread has died we don't want to raise an exception so log.
    if not self.is_alive():
      _LOG.debug('Not raising %s because thread %s (%s) is not alive',
                 exc_type, self.name, self.ident)
      return

    result = ctypes.pythonapi.PyThreadState_SetAsyncExc(
        ctypes.c_long(self.ident), ctypes.py_object(exc_type))
    if result == 0 and self.is_alive():
      # Don't raise an exception an error unnecessarily if the thread is dead.
      raise ValueError('Thread ID was invalid.', self.ident)
    elif result > 1:
      # Something bad happened, call with a NULL exception to undo.
      ctypes.pythonapi.PyThreadState_SetAsyncExc(self.ident, None)
      raise RuntimeError('Error: PyThreadState_SetAsyncExc %s %s (%s) %s' % (
          exc_type, self.name, self.ident, result))
def async_raise ( self , exc_type ) : assert self . ident is not None , 'Only started threads have thread identifier' if not self . is_alive ( ) : _LOG . debug ( 'Not raising %s because thread %s (%s) is not alive' , exc_type , self . name , self . ident ) return result = ctypes . pythonapi . PyThreadState_SetAsyncExc ( ctypes . c_long ( self . ident ) , ctypes . py_object ( exc_type ) ) if result == 0 and self . is_alive ( ) : raise ValueError ( 'Thread ID was invalid.' , self . ident ) elif result > 1 : ctypes . pythonapi . PyThreadState_SetAsyncExc ( self . ident , None ) raise RuntimeError ( 'Error: PyThreadState_SetAsyncExc %s %s (%s) %s' % ( exc_type , self . name , self . ident , result ) )
Raise the exception.