'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 |