2012-11-28 74 views
6

我需要一個替代方案來殺死線程函數中的python腳本。我的意圖是當客戶端輸入一個0時終止服務器...這是行不通的,因爲線程還沒有終止?這裏是我的代碼:爲什麼sys.exit(),exit()方法引發SystemExit不起作用?

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM); 
print 'Socket created' 

try: 
    socket.bind((HOST, PORT)) 
except socket.error, message: 
    print 'Bind statement failed. ERROR: ' + str(message[0]) + ' Message: ' + message[1] 
    sys.exit() 

print 'Socket Binding Successful' 

socket.listen(10) 
print 'Socket is currently listening' 


def clientThread(connection): 
    while 1: 
     data = connect.recv(1024) 
     try: 
      quit = int(data) 
     except: 
      quit = 3 
     if quit == 0: 
      print 'Closing the connection and socket...' 
      connect.close() 
      socket.close() 
      sys.exit(); //Alternative needed here... 
      break 
     reply = 'Ok....' + data 
     if not data: 
      break 
     connect.sendall(reply) 


while 1: #forever loop 
    connect, address = socket.accept() 
    print 'Just connected with ' + address[0] + ' : ' + str(address[1]) 
    start_new_thread(clientThread, (connect,)) 

socket.close() 

回答

8

的問題是,所有sys.exit()確實是提高SystemExit。由於這發生在工作者線程中,所以效果是停止該線程(異常不會跨線程傳播)。

您可以嘗試通過自己的某種機制或通過調用thread.interrupt_main()向主線程發送腳本需要終止的信號。

對於大錘方法,請致電os._exit()

+0

我導入操作系統,但是當試圖'os._exit()'我得到的錯誤:回溯(最近最後調用最後): 文件「server.py」,第35行,在clientThread中 os._exit(); NameError:未定義全局名稱'os' –

+1

@CSGamer:您在哪裏添加了導入?你確定你沒有錯字嗎?因爲沒有理由不應該工作。 – abarnert

+0

這裏是我的進口頂端:import import import sys from thread import *' –

-3

你可以只是raise SystemExit但這看起來真的很苛刻。也許一些合作線程的手段會工作(即:一個隊列與哨兵)

+4

提高SystemExit不殺死腳本。只有調用它的線程... –

+0

這是因爲'提升SystemExit'和'sys.exit'基本上是[相同](https://stackoverflow.com/q/36302165/321973) –

相關問題