Is it possible to kill the parent thread from within a child thread in python?
<p>I am using Python 3.5.2 on windows. </p>

<p>I would like to run a python script but guarantee that it will not take more than <strong>N</strong> seconds. If it <em>does</em> take more than <strong>N</strong> seconds, an exception should be raised, and the program should exit. Initially I had thought I could just launch a thread at the beginning that waits for <strong>N</strong> seconds before throwing an exception, but this only manages to throw an exception to the timer thread, not to the parent thread. For example:</p>

<pre><code>import threading
import time

def may_take_a_long_time(name, wait_time):
    print("{} started...".format(name))
    time.sleep(wait_time)
    print("{} finished!.".format(name))

def kill():
    time.sleep(3)
    raise TimeoutError("No more time!")

kill_thread = threading.Thread(target=kill)
kill_thread.start()

may_take_a_long_time("A", 2)
may_take_a_long_time("B", 2)
may_take_a_long_time("C", 2)
may_take_a_long_time("D", 2)
</code></pre>

<p>This outputs:</p>

<pre><code>A started...
A finished!.
B started...
Exception in thread Thread-1:
Traceback (most recent call last):
    File "C:\Program Files\Python35\lib\threading.py", line 914, in _bootstrap_inner
    self.run()
    File "C:\Program Files\Python35\lib\threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
    File "timeout.py", line 11, in kill
    raise TimeoutError("No more time!")
    TimeoutError: No more time!

B finished!.
C started...
C finished!.
D started...
D finished!.
</code></pre>

<p>Is this even remotely possible? I realize I could do something like this:</p>

<pre><code>import threading
import time

def may_take_a_long_time(name, wait_time, thread):
    if not thread.is_alive():
        return
    print("{} started...".format(name))
    time.sleep(wait_time)
    print("{} finished!.".format(name))

def kill():
    time.sleep(3)
    raise TimeoutError("No more time!")

kill_thread = threading.Thread(target=kill)
kill_thread.start()

may_take_a_long_time("A", 2, kill_thread)
may_take_a_long_time("B", 2, kill_thread)
may_take_a_long_time("C", 2, kill_thread)
may_take_a_long_time("D", 2, kill_thread)
</code></pre>

<p>But this method fails if, for example, <code>may_take_a_long_time("B", 60, kill_thread)</code> was called. </p>

<p>So I guess my TL;DR question is, what's the best way to put a time limit on the main thread itself?</p>

<p>If the parent thread is the root thread, you may want to try <code>os._exit(0)</code>.</p>

<pre><code>import os
import threading
import time

def may_take_a_long_time(name, wait_time):
    print("{} started...".format(name))
    time.sleep(wait_time)
    print("{} finished!.".format(name))

def kill():
    time.sleep(3)
    os._exit(0)

kill_thread = threading.Thread(target=kill)
kill_thread.start()

may_take_a_long_time("A", 2)
may_take_a_long_time("B", 2)
may_take_a_long_time("C", 2)
may_take_a_long_time("D", 2)
</code></pre>

python multithreading time