[3] | 1 | """ |
---|
| 2 | Kill a thread, from http://sebulba.wikispaces.com/recipe+thread2 |
---|
| 3 | """ |
---|
| 4 | import types |
---|
| 5 | try: |
---|
| 6 | import ctypes |
---|
| 7 | except ImportError: |
---|
| 8 | raise ImportError( |
---|
| 9 | "You cannot use paste.util.killthread without ctypes installed") |
---|
| 10 | |
---|
| 11 | def async_raise(tid, exctype): |
---|
| 12 | """raises the exception, performs cleanup if needed. |
---|
| 13 | |
---|
| 14 | tid is the value given by thread.get_ident() (an integer). |
---|
| 15 | Raise SystemExit to kill a thread.""" |
---|
| 16 | if not isinstance(exctype, (types.ClassType, type)): |
---|
| 17 | raise TypeError("Only types can be raised (not instances)") |
---|
| 18 | if not isinstance(tid, int): |
---|
| 19 | raise TypeError("tid must be an integer") |
---|
| 20 | res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype)) |
---|
| 21 | if res == 0: |
---|
| 22 | raise ValueError("invalid thread id") |
---|
| 23 | elif res != 1: |
---|
| 24 | # """if it returns a number greater than one, you're in trouble, |
---|
| 25 | # and you should call it again with exc=NULL to revert the effect""" |
---|
| 26 | ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0) |
---|
| 27 | raise SystemError("PyThreadState_SetAsyncExc failed") |
---|