[Python-Dev] Status of thread cancellation

glyph at divmod.com glyph at divmod.com
Fri Mar 16 23:00:22 CET 2007


On 12:06 am, greg.ewing at canterbury.ac.nz wrote:
>glyph at divmod.com wrote:
>>Can you suggest any use-cases for thread termination which will *not* 
>>result in a completely broken and unpredictable heap after the thread 
>>has died?
>
>Suppose you have a GUI and you want to launch a
>long-running computation without blocking the
>user interface. You don't know how long it will
>take, so you want the user to be able to cancel
>it if he gets bored.

That's a perfectly reasonable use-case which doesn't require this 
feature at all ;).
>Interaction with the rest of the program is
>extremely limited -- some data is passed in,
>it churns away, and some data is returned. It
>doesn't matter what happens to its internal
>state if it gets interrupted, as it's all going
>to be thrown away.

If that's true, then the state-sharing features of threads aren't 
required, which is the right way to design concurrent software anyway.
>In that situation, it doesn't seem unreasonable
>to me to want to be able to just kill the thread.
>I don't see how it could do any more harm than
>using KeyboardInterrupt to kill a program,
>because that's all it is -- a subprogram running
>inside your main program.

The key distinction between threads and processes is the sharing of 
internal program state.
>How would you handle this situation?

Spawn a process, deliver the result via an event.

If you're allergic to event-driven programming, then you can spawn a 
process *in* a thread, and block in the thread on reading from the 
process's output, then kill the *process* and have that terminate the 
output, which terminates the read().  This is a lot like having a queue 
that you can put a "stop" object into, except the "file" interface 
provided by OSes is kind of crude.  Still no need to kill the thread.

At the end of the day though, you're writing a GUI in this use-case and 
so you typically *must* be cognizant of event-driven issues anyway. 
Many GUIs (even in the thread-happy world of Windows) aren't thread-safe 
except for a few specific data-exchange methods, which behave more or 
less like a queue.

One of the 35 different existing ways in which one can spawn a process 
from Python, I hope, will be sufficient for this case :).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-dev/attachments/20070316/131a3f48/attachment.html 


More information about the Python-Dev mailing list