Skip to content
Advertisement

Kill python thread using os

I’ve already asked similar question many times, but still can’t find appropriate solution.

I have and external function, that could run in some cases very long. I want to interrupt it after, say, 30 seconds.

How do I do that?

  1. Threads are good, but I can’t stope them (i don’t have access to external function’s code)
  2. Multiprocessing is also not an option, because I run site under mod_wsgi.

Are there any reliable ways to stop the thread? Maybe using os.system or os.kill. If yes, then how?

External function only performs some caclulations, no network connections or file openings. So, I just need to stop process and clean up.

My code (actually was taken from some source):

def time_limit(timeout):
    def internal(function):
        def internal2(*args, **kw):
            class MyThread(threading.Thread):
                def __init__(self):
                    threading.Thread.__init__(self)
                    self.result = None
                    self.error = None

                def run(self):
                    try:
                        self.result = function(*args, **kw) # this is external
                    except Exception as e:
                        self.error = e

                def _stop(self):
                    if self.isAlive():
                        threading.Thread._Thread__stop(self)

            c = MyThread()
            c.start()
            c.join(timeout)
            counter = 0
            if c.isAlive():
                c._stop()
                raise TimeoutException
            if c.error:
                raise c.error
            return c.result
        return internal2
    return internal

Advertisement

Answer

You can’t kill thread, but you can kill a process. If you can use processes instead threads, you can use multithreading module. Process can be terminated from parent application.

If you describe your task in more detail, maybe I can help more.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement