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