How to get a raised exception from other thread

WalterHoward at gmail.com WalterHoward at gmail.com
Fri Oct 21 19:48:56 CEST 2005


Peter Hansen wrote:
> themightydoyle at gmail.com wrote:
> > Nevermind.  I found a better solution.  I used shared memory to create
> > a keep-alive flag.  I then use the select function with a specified
> > timeout, and recheck the keep-alive flag after each timeout.
>
> As Dennis points out, your original attempt was destined to fail because
> you were calling the method from the main thread, not the one you wanted
> to kill.  Threads don't magically execute any methods that are attached
> to the Thread instance just because they're attached.  You have to
> actually call those methods *from* the thread, which means from the
> run() method or from any of the routines it calls (whether they are
> methods on that Thread or not), but it must be done in the context of
> the thread you want to raise exceptions in or it won't work.
>
> More importantly, you've now described your use case (and I hope that of
> the OP as well, since he hasn't replied yet): killing threads.
>
> This is an oft-discussed topic here, and searching the archives will
> probably give you lots more answers, but the short answer is you cannot
> kill a thread in Python (except by exiting the entire process). Instead,
> as you've discovered, you must ask it nicely to exit.  The nearly
> canonical approach to doing that is as follows:
>
> class MyThread(threading.Thread):
>      def __init__(self, *args, **kwargs):
>          threading.Thread.__init__(self, *args, **kwargs)
>          self._keepRunning = True
>
>      def stop(self, timeout=None):
>          self._keepRunning = False
>          # optional: wait for thread to exit
>          self.join(timeout=timeout)
>
>      def run(self):
>          while self._keepRunning:
>              # do stuff here
>
> Now you can do things like this:
>
> thread = MyThread()
> thread.start()
> # other stuff...
> thread.stop()    # block here until the thread exits
> 
> I hope that clarifies things a little more...
> 
> -Peter




More information about the Python-list mailing list