首先单单设置 daemon 为 true 肯定不行,就不解释了。当daemon为 false 时,导入python线程库后实际上,threading会在主线程执行完毕后,检查是否有不是 daemon 的线程,有的化就wait,等待线程结束了,在主线程等待期间,所有发送到主线程的信号也会被阻测,可以在上述代码加入signal模块验证一下:
只能把线程设成daemon才能让主线程不等待,能够接受ctrl-c信号,但是又不能让子线程立即结束,那么只能采用传统的轮询方法了,采用sleep间歇省点cpu吧:
 
   缺点:轮询总会浪费点cpu资源,以及battery.
# -*- coding: utf-8 -*-  
import time,signal,traceback,os  
import sys  
import threading  
start=time.time()  
def foreverLoop():  
    start=time.time()  
    while 1:  
        time.sleep(1)  
        print time.time()  
        if time.time()-start>5:  
            break    
class Watcher:  
    """this class solves two problems with multithreaded 
    programs in Python, (1) a signal might be delivered 
    to any thread (which is just a malfeature) and (2) if 
    the thread that gets the signal is waiting, the signal 
    is ignored (which is a bug).  
    The watcher is a concurrent process (not thread) that 
    waits for a signal and the process that contains the 
    threads.  See Appendix A of The Little Book of Semaphores.     
http://greenteapress.com/semaphores/      I have only tested this on Linux.  I would expect it to 
    work on the Macintosh and not work on Windows. 
    """    
    def __init__(self):  
        """ Creates a child thread, which returns.  The parent 
            thread waits for a KeyboardInterrupt and then kills 
            the child thread. 
        """  
        self.child = os.fork()  
        if self.child == 0:  
            return  
        else:  
            self.watch()    
    def watch(self):  
        try:  
            os.wait()  
        except KeyboardInterrupt:  
            # I put the capital B in KeyBoardInterrupt so I can  
            # tell when the Watcher gets the SIGINT  
            print 'KeyBoardInterrupt'  
            self.kill()  
        sys.exit()    
    def kill(self):  
        try:  
            os.kill(self.child, signal.SIGKILL)  
        except OSError: pass    
Watcher()              
thread_=threading.Thread(target=foreverLoop)  
thread_.start()