We may often need to signal the thread to do some special task. Simple solution is to create events.
Definition from python docs:
threading.Event()
A factory function that returns a new event object. An event manages a flag that can be set to true with the set() method and reset to false with the clear() method. The wait() method blocks until the flag is true
the event represents an internal flag, and threads can wait for the flag to be set, or set or clear the flag themselves. The methods provided are very much self explanatory: set() clear() isSet() wait(timeout).
if we run the program, here is the output
Any number of threads can wait on same event and can set same event. once the even is set it will notify all the threads ( equivalent to notifyall() method )
Definition from python docs:
threading.Event()
A factory function that returns a new event object. An event manages a flag that can be set to true with the set() method and reset to false with the clear() method. The wait() method blocks until the flag is true
the event represents an internal flag, and threads can wait for the flag to be set, or set or clear the flag themselves. The methods provided are very much self explanatory: set() clear() isSet() wait(timeout).
This is a simple mechanism. A thread signals an event and the other thread(s) wait for it.
In the following example we are crating an event and a thread, and passing that event to the thread function. that thread function is waiting on that event. if user press ctrl+c then it is caught in the main program by keyboardInterrup and we are setting the stop event. This even cause the while in the thread function to break and exits the thread.
In the following example we are crating an event and a thread, and passing that event to the thread function. that thread function is waiting on that event. if user press ctrl+c then it is caught in the main program by keyboardInterrup and we are setting the stop event. This even cause the while in the thread function to break and exits the thread.
#!/usr/bin/python import threading,time def collectstats(event): while not event.is_set(): event.wait(1) print "event set.. thread exiting.." stop_event = threading.Event() th = threading.Thread(target=collectstats, args=(stop_event,)) th.start() while True: try: time.sleep(100) except KeyboardInterrupt as e: stop_event.set() th.join() break; print "in main: exiting.."
if we run the program, here is the output
# ./even.py ^Cevent set.. thread exiting.. in main: exiting..
Any number of threads can wait on same event and can set same event. once the even is set it will notify all the threads ( equivalent to notifyall() method )