Killable Threads August 13, 2006
The thread2
module is an extension of the standard threading
module, and provides the means
to raise exceptions at the context of the given thread. You can use raise_exc()
to raise an
arbitrary exception, or call terminate()
to raise SystemExit
automatically.
It uses the unexposed PyThreadState_SetAsyncExc
function (via ctypes
) to raise an exception
in the context of the given thread. Inspired by the code of Antoon Pardon at
http://mail.python.org/pipermail/python-list/2005-December/316143.html.
Issues
- The exception will be raised only when executing python bytecode. If your thread calls a
native/built-in blocking function, the exception will be raised only when execution returns to
the python code.
- There is also an issue if the built-in function internally calls
PyErr_Clear()
, which would effectively cancel your pending exception. You can try to raise it again.
- There is also an issue if the built-in function internally calls
- Only exception types can be raised safely. Exception instances are likely to cause
unexpected behavior, and are thus restricted.
- For example:
t1.raise_exc(TypeError)
and nott1.raise_exc(TypeError("blah"))
. - IMHO it’s a bug, and I reported it as one. For more info, http://mail.python.org/pipermail/python-dev/2006-August/068158.html
- For example:
- I asked to expose this function in the built-in
thread
module, but sincectypes
has become a standard library (as of 2.5), and this feature is not likely to be implementation-agnostic, it may be kept unexposed.