我试图在多线程程序中从子线程向主线程发送信号(不能使用多进程)。不幸的是,即使在用尽了所有在线阅读材料(我可以找到)之后,我仍无法清楚地知道如何做到这一点。我是信号和Python的初学者,所以请耐心听我解释,就像向新手解释一样。
我无法在进程中使用 join 方法,因为我希望两个线程同时运行。
这是我发现与此处主题相关的代码 -http://pymotw.com/2/signal/#signals-and-threads这对我来说并不起作用。
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()
如果可能,请用多线程示例进行解释。
提前致谢!
信号和线程真的、真的不能很好地结合在一起。
考虑使用Event
或其他同步机制。以下示例创建一个“事件”对象,然后将其传递给两个线程。一个等待两秒钟,然后示意另一个打印一条消息,然后退出。
source
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()
output
Waiting for event
event set.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)