2015-02-05 40 views
1

我開始使用的SocketServer簡單的TCP服務器:SocketServer的永遠不會退出

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 
... 
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) 
server_thread = threading.Thread(target=server.serve_forever) 
server_thread.daemon = True 
server_thread.start() 
try: 
... 
finally: 
    server.shutdown() 

然而,程序結束它不會終止,之後似乎被卡住。它不響應鍵盤事件(CTRL-C),唯一的退出方式是調用os._exit(0)或關閉shell窗口。

我已經搜索了一下,但我仍然沒有看到我缺少的東西:線程被標記爲守護進程,並且服務器在最後被關閉。

我的Windows 8.1

+0

你嘗試:'server_thread.join()' – ozgur 2015-02-05 20:30:46

+0

@ozgurv好一點。如果代碼正常結束,它將終止。但是,如果拋出一個異常(例如CTRL-C),它仍然會被'server_thread.join()'(但不會與'os._exit(0)')卡住 – 2015-02-05 20:53:53

回答

0

按Ctrl-C引發KeyboardInterrupt異常,問題是SocketServer的內部捕獲錯誤,但從來沒有困擾出來下運行的Python 2.7.9。您可以爲signal.SIGINT &添加額外的信號處理程序,然後致電server.start()。 這樣,

import signal 
import sys 
def signal_handler(signal, frame): 
    logger.log("DEBUG","You pressed Ctrl+C!") 
    server.stop() 
    sys.exit(0) 
signal.signal(signal.SIGINT, signal_handler) 
server_thread.start() 
signal.pause() 
+0

這不正確 - 它會寫「You pressed按Ctrl + C「!並仍然卡住。但如果我用os._exit(0)替換sys.exit(0),它會退出應用程序。用os._exit退出並不像一個乾淨的解決方案。 – 2015-02-15 21:41:21

+0

和順便說一句我認爲它'server.shutdown()'不'server.stop()' – 2015-02-15 21:43:25