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