How to close a thread when multithreading?

To simplify the situation I’m having: I’m trying to terminate a thread while it is still running in Python 2.7, and I’m not sure how to do it.

Take this simple code:

import time
import threading

def thread1():
        print "Starting thread 1"
        while True:
                time.sleep(0.5)
                print "Working"

thread1 = threading.Thread(target=thread1, args=())
thread1.start()

time.sleep(2)
print "Killing thread 1"
thread2.stop()
print "Checking if it worked:"
print "Thread is: " + str(thread1.isAlive())

Thread 1 keeps on ‘working’ and I’m trying to kill it in the main thread. Any idea on how to do it? I’ve tried:

threat1.terminate
threat1.stop
threat1.quit
threat1.end

This all seems to point that there is no way to really stop it with a simple line of code. What could you suggest?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

To terminate an Thread controlled, using a threadsafe threading.Event():

import threading, time

def Thread_Function(running):
    while running.is_set():
        print('running')
        time.sleep(1)

if __name__ == '__main__':
    running = threading.Event()
    running.set()

    thread = threading.Thread(target=Thread_Function, args=(running,))
    thread.start()

    time.sleep(1)
    print('Event running.clear()')
    running.clear()

    print('Wait until Thread is terminating')
    thread.join()
    print("EXIT __main__")

Output:

running  
running  
Event running.clear()  
Wait until Thread is terminating  
EXIT __main__

Tested with Python:3.4.2


Online Demo: reply.it

Method 2

Usually, in this cases, I use some kind of signal:

import time
import threading

class thread1(threading.Thread):

    def run(self):
        self.kill = False
        print "Starting thread 1"
        while not self.kill:
                time.sleep(0.5)
                print "Working"

thread_obj = thread1()
thread_obj.start()

time.sleep(2)
print "Killing thread 1"
thread_obj.kill = True
print "Checking if it worked:"
time.sleep(1)
print "Thread is: " + str(thread_obj.isAlive())

EDIT

After reading the answer suggested in one of the comment… I realized that this is just a simplified version of what is described there. I hope this will be useful anyway.

Method 3

Indeed!

threads cannot be destroyed, stopped, suspended, resumed, or interrupted

(So say the docs in a paragraph below the link.)

Make your threads listen to signals you may send, via a queue (best), a shared variable (worse), or any other means. Be careful and don’t let them run unchecked loops, as in your example code.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x