代码来自PyMOTW 信号章节。为什么当alarm_thread发出信号时,主线程没有立即处理警报信号。作者的输出显示当警报线程完成(alarm_thread.join()
返回)时处理警报信号。
import signal
import time
import threading
def signal_handler(num, stack):
print time.ctime(), 'Alarm in', threading.currentThread()
signal.signal(signal.SIGALRM, signal_handler)
def use_alarm():
print time.ctime(), 'Setting alarm in', threading.currentThread()
signal.alarm(1)
print time.ctime(), 'Sleeping in', threading.currentThread()
time.sleep(3)
print time.ctime(), 'Done with sleep'
# Start a thread that will not receive the signal
alarm_thread = threading.Thread(target=use_alarm, name='alarm_thread')
alarm_thread.start()
time.sleep(0.1)
# Wait for the thread to see the signal (not going to happen!)
print time.ctime(), 'Waiting for', alarm_thread
alarm_thread.join()
print time.ctime(), 'Exiting normally'
作者的输出:
$ python signal_threads_alarm.py
Sun Aug 17 12:06:00 2008 Setting alarm in <Thread(alarm_thread, started)>
Sun Aug 17 12:06:00 2008 Sleeping in <Thread(alarm_thread, started)>
Sun Aug 17 12:06:00 2008 Waiting for <Thread(alarm_thread, started)>;
Sun Aug 17 12:06:03 2008 Done with sleep
Sun Aug 17 12:06:03 2008 Alarm in <_MainThread(MainThread, started)>
Sun Aug 17 12:06:03 2008 Exiting normally
在我看来,输出应该如下所示。报警信号应该由主线程处理,before
报警线程休眠完成,并alarm_thread.join()
返回。
$ python signal_threads_alarm.py
Sun Aug 17 12:06:00 2008 Setting alarm in <Thread(alarm_thread, started)>
Sun Aug 17 12:06:00 2008 Sleeping in <Thread(alarm_thread, started)>
Sun Aug 17 12:06:00 2008 Waiting for <Thread(alarm_thread, started)>;
Sun Aug 17 12:06:03 2008 Alarm in <_MainThread(MainThread, started)>
Sun Aug 17 12:06:03 2008 Done with sleep
Sun Aug 17 12:06:03 2008 Exiting normally