0

任何人都可以告诉我为什么KeyboardInterrupt不在这里工作?我需要按CTRL + C来结束这两个线程。两个线程 - 定时器线程和Web服务器线程。下面是代码 -Python中KeyboardInterrupt在多线程

import threading 
import thread 
import time 
import urllib2 
import httplib 

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 
from SocketServer import ThreadingMixIn 
import Queue 
import signal 
import sys 

q = Queue.Queue() 
j = Queue.Queue() 
h = "threading working!" 

class SignalHandler: 
    stopper = None  
    def __init__(self,stopper): 
     self.stopper = stopper 

    def __call__(self, signum, frame): 
     self.stopper.set() 
     sys.exit(0) 

#Timer Thread 
class myThread(threading.Thread): 
    stopper = None 

    def __init__(self, **kwargs): 
     self.req = [] 
     self.stopper = stopper 
     for k, v in kwargs.iteritems(): 
      setattr(self, k, v) 
     threading.Thread.__init__(self) 

    def run(self): 
     while not self.stopper.is_set(): 
      while self.go: 
       try: 
       while True: 
        r = q.get_nowait() 
        self.req.append(r) 
       except Queue.Empty, e: 
        pass 
       t = threading.Timer(1,self.hello, [h]) 
       t.start() 
       time.sleep(1) 

    def hello(self, s): 
     print s   
     while self.req:    
     r = self.req.pop() 
     print "Client Request >>>>>>>", r            
     thread_id = str(threading.currentThread()) 
     j.put(thread_id)         

    def stop(self): 
     print "Stopping thread.." 
     self.go = False 
     try: 
      while True: 
       q.get_nowait() 
      q.task_done() 
     except Queue.Empty, e: 
      pass  

#Webserver thread 
class Handler(BaseHTTPRequestHandler): 

    def do_HEAD(self): 
     self.send_response(200)   
     self.send_header("Content type", "text/html") 
     self.end_headers() 

    def do_GET(self): 
     self.do_HEAD() 
     req = (self.path, self.client_address, self.command,)   
     q.put(req)  
     self.wfile.write("Thread Info: ") 
     self.wfile.write(j.get())     
     return   

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): 
    """Handle requests in a separate thread.""" 

#main 
if __name__ == '__main__': 
    stopper = threading.Event() 
    handler = SignalHandler(stopper) 
    signal.signal(signal.SIGINT, handler) 
    server = ThreadedHTTPServer(('localhost', 8080), Handler) 
    try: 
     timer_thread = myThread(stopper,go=True)   
     timer_thread.start()  
     server_thread = threading.Thread(target=server.serve_forever) 
     server_thread.daemon = True 
     server_thread.start()   
     print 'Starting server, use <Ctrl-C> to stop' 
    except KeyboardInterrupt, e: 
     print "Interrupted" 
     q.join() 
     j.join() 
     timer_thread.stop() 
     timer_thread.join()  
+0

请先修复缩进以帮助更好地阅读代码。 –

+0

完成。现在希望它更好。谢谢 –

+0

您的缩进仍然关闭。检查班级内的代码,尤其是 –

回答

0

首先,您的实例myThread在创建时出错,必须是stopper=stopper(关键字arg是预期的)。其次,代码有错误,主线程不等待服务器线程,但立即去join() s。所以,except从来没有发生 - 什么都不会被打印。主要的bug在join()。加入Python不会因信号而中断。所以,你必须编写自己的连接函数,它会以超时(例如1秒)调用原始的join(),但在不定式循环中。更好的是让加入时间稍短,然后 - sleep() - 睡眠不可中断。两者都在循环中。

+0

它工作。谢谢 –

0

尝试打印东西的except KeyboardInterrupt旁边,之前调用join() S,BCZ加入正在等待的线程来完成。

+0

它没有打印它。 –