I Am trying to send a signal from a child thread to the main thread in a multi-threaded program (cannot use multi-processes). Unfortunately even after exhausting all the reading materials available online (which I could find), I Am unable to get a clear idea of how to do so. I Am a beginner to signals AND to python so please bear with me and explain as you would to a novice. I cannot use the join method in the process, since I want both the threads to be running simultaneously. Here is the code that I found related to the topic here - <a href="http://pymotw.com/2/signal/#signals-and-threads" rel="nofollow">http://pymotw.com/2/signal/#signals-and-threads</a> and it doesn't really work for me.
import signal import threading import os import time def signal_handler(num, stack): print 'Received signal %d in %s' % (num, threading.currentThread()) signal.signal(signal.SIGUSR1, signal_handler) def wait_for_signal(): print 'Waiting for signal in', threading.currentThread() signal.pause() print 'Done waiting' # Start a thread that will not receive the signal receiver = threading.Thread(target=wait_for_signal, name='receiver') receiver.start() time.sleep(0.1) def send_signal(): print 'Sending signal in', threading.currentThread() os.kill(os.getpid(), signal.SIGUSR1) sender = threading.Thread(target=send_signal, name='sender') sender.start() sender.join() # Wait for the thread to see the signal (not going to happen!) print 'Waiting for', receiver signal.alarm(2) receiver.join()
Please explain with a multi-threaded example if possible. Thanks in advance!Answer1:
Signals and threads really, really don't play nice together.
Consider use an
Event or other synchronization mechanism. The following example creates an 'event' object, then passes it to two threads. One waits for two seconds, then signals the other to print out a message then exit.
import threading, time def flagger_thread(event): """ wait for two seconds, then make 'event' fire """ time.sleep(2) event.set() def waiter_thread(event): print("Waiting for event") if event.wait(5): print("event set.") else: print("Timed out.") stop_event = threading.Event() threading.Thread(target=flagger_thread, args=[stop_event]).start() threading.Thread(target=waiter_thread, args=[stop_event]).start() # wait for all threads to exit for t in threading.enumerate(): if t != threading.current_thread(): t.join()<h2>output</h2>
Waiting for event event set.