code: def async_raise(self, exc_type):
      
      # 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))
docs: Raise the exception.