0

I have some code:

red = "\033[1;31m"
green = "\033[1;32m"
yellow = "\033[1;33m"
blue = "\033[1;34m"
defaultcolor = "\033[0m"

class watek(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        x=1 

def timer(stopon):
    timertime = 0
    while True:
        time.sleep(1)
        timertime += 1
        print timertime
        if timertime == stopon:
            killpro()
def killpro():
    sys.exit()

threadsyy = []

threadsamount = 300
i = 1
while i <= threadsamount:
    thread = watek()
    threadsyy.append(thread)
    i += 1
    print(yellow + "Thread number" + defaultcolor + ": " + red + str(i) + yellow + " created." + '\n')

a = 0
for f in threadsyy:
    f.start()
    a += 1
    #print "Thread work " + str(a)
timer(5)

And i need to terminate the scipt after 5 seconds. I tried to use sys.exit and killing the process using psutil. Anyone know how to terminate it? I'm trying with:

class watek(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self._kill = threading.Event()

and use

watek.kill()

but it doesn't work either.

2
  • 1
    Not sure what the problem is here, your thread dies as soon as x becomes 1 when you do x=1. There's nothing holding the thread alive. Try doing f.isAlive() in your for loop, you'll see that the threads are dead? Also, there's no need to tag this post with both python-3 and python-2, they both live under the same tag as python - meaning they'll get the same attention, it just helps us clarify which type of code we're looking at / the challenges the two different versions come with. And since you're doing print timertime it indicates Python2, so i removed python-3. Commented Nov 10, 2018 at 11:05
  • Note that just adding an event to your Thread object will not do anything useful. The code executed in the thread has to actually check and respond to such a termination flag. Commented Nov 10, 2018 at 11:15

1 Answer 1

1

This won't solve your problem, but I'll leave this here in case someone comes from a search engine looking for ending threads nicely where the threads are actually still alive.

class worker(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self)

    def run(self):
        main_thread = None
        for thread in threading.enumerate():
            if thread.name == 'MainThread':
                main_thread = thread
                break

        while main_thread and main_thread.isAlive():
            #do_work()
            print('Thread alive')
            time.sleep(1)

# I'll keep some of the analogy from above here:
threads = []
thread = worker()
threads.append(thread)

for f in threads:
    f.start()

time.sleep(5)

for f in threads:
    print('Is thread alive:', f.isAlive())

The program will quit after ~5 seconds, right after it prints if the threads alive alive (which they will be), but those threads will look for the main process status and terminate if the main thread dies.

This is one way of creating a thread that will end when the main program does.
The problem is larger in practice, where you'd have to make sure they terminate nicely and clean up them selves. There's also f.join() which will wait for the threads to terminate, a nice explanation can be found here: what is the use of join() in python threading

There's also signaling to the thread that it's time to quit, this has also been discussed thoroughly and a good example of that is here: How to stop a looping thread in Python?

This is just a minimal example (still incomplete, but works) that shows the general gist of how you can create threads that terminates when the main program does.

Sign up to request clarification or add additional context in comments.

3 Comments

You may just want to flag the question as a duplicate, there are tons of such solutions on SO already.
@MisterMiyagi True, and I did. Didn't find the relevant post after posting my answer, and I've already flagged the post as "unclear" because I didn't fully think the question was clear enough to understand the problem - since the threads didn't actually stay alive.. heh. But you're 100% correct.
FWIW, the solution you posted is one I have not seen yet. ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.