Killing a thread

crazymykl at gmail.com crazymykl at gmail.com
Sat Jun 10 20:58:15 CEST 2006


Fredrik Lundh wrote:
> Carl J. Van Arsdall wrote:
>
> > Are there any plans in the future to add the capability to kill threads
> > from the outside?
>
> it cannot be done in a portable way, so that's not very likely.
>

import sys, trace, threading

class KThread(threading.Thread):
  """A subclass of threading.Thread, with a kill() method."""
  def __init__(self, *args, **keywords):
    threading.Thread.__init__(self, *args, **keywords)
    self.killed = False

  def start(self):
    """Start the thread."""
    self.__run_backup = self.run
    self.run = self.__run      # Force the Thread to install our trace.
    threading.Thread.start(self)

  def __run(self):
    """Hacked run function, which installs the trace."""
    sys.settrace(self.globaltrace)
    self.__run_backup()
    self.run = self.__run_backup

  def globaltrace(self, frame, why, arg):
    if why == 'call':
      return self.localtrace
    else:
      return None

  def localtrace(self, frame, why, arg):
    if self.killed:
      if why == 'line':
        raise SystemExit()
    return self.localtrace

  def kill(self):
    self.killed = True




More information about the Python-list mailing list