'How to close a thread when multithreading? [duplicate]

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?



Solution 1:[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

Solution 2:[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.

Solution 3:[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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Riccardo Petraglia
Solution 3 9000