Embedding Python in a multi-threaded C++ application
jepler at unpythonic.net
Tue Nov 9 22:50:13 CET 2004
Something along the lines of PyErr_SetInterrupt() is the best you can
do in CPython, unless there's a facility I don't know about. If your
code is not running through the Python bytecode interpreter loop, then
it's in some unknown and uninterruptable state. I'm there may be
something else you can do, but it'll be a "you get to keep both pieces
[when it breaks]" kind of solution.
For some reasons why a facility to forcibly terminate a thread was
removed from Java, a language with a richer set of thread-related tools,
down at the heading "Asynchronous Termination":
The stop method was originally included in class Thread, but its
use has since been deprecated. Thread.stop causes a thread to
abruptly throw a ThreadDeath exception regardless of what it is
doing. (Like interrupt, stop does not abort waits for locks or IO.
But, unlike interrupt, it is not strictly guaranteed to abort wait,
sleep, or join.)
This can be an arbitrarily dangerous operation. Because Thread.stop
generates asynchronous signals, activities can be terminated while
they are in the midst of operations or code segments that
absolutely must roll back or roll forward for the sake of program
safety and object consistency.
The same considerations apply to Python, and additionally Python has
been designed on the side of simplicity and portability rather than to
offer all the features of some particular OS threading library.
(that said, PyErr_SetInterrupt *is* a lot like ThreadDeath, because it
can be fired at any moment the interpreter "between bytecodes", which
means all kinds of higher-level consistency requirements could be
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 196 bytes
Desc: not available
More information about the Python-list