2012-11-28 6 views
6

Ho bisogno di un'alternativa per uccidere lo script python all'interno di una funzione thread. La mia intenzione è uccidere il server quando il client entra in uno 0 ... Non funziona perché i thread non sono stati terminati? Qui è il mio codice:Perché i metodi sys.exit(), exit(), raise SystemExit non funzionano?

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() 

risposta

8

Il problema è che tutto sys.exit() non fa altro che aumentare SystemExit. Poiché ciò accade in un thread di lavoro, l'effetto è interrompere quel thread (le eccezioni non si propagano tra thread).

Si potrebbe provare a segnalare al thread principale che lo script deve terminare, sia con un meccanismo proprio o chiamando lo thread.interrupt_main().

Per un approccio a martello, chiamare os._exit().

+0

I import, ma quando provo 'os._exit()' ottengo l'errore: Traceback (ultima chiamata ultima): File "server.py", riga 35, in clientThread os._exit(); NameError: nome globale 'os' non definito –

+1

@CSGamer: dove hai aggiunto l'importazione? Sei sicuro di non avere un errore di battitura? Perché non c'è motivo che non dovrebbe funzionare. – abarnert

+0

Ecco le mie importazioni nella parte superiore: 'import os import sys dall'importazione di thread *' –

-3

Si può solo raise SystemExit ma sembra davvero difficile. Forse alcuni metodi di threading cooperativo funzionerebbero (ad esempio: una coda con una sentinella)

+4

, SystemExit non uccide neanche lo script. Solo il thread che lo chiama ... –

+0

Questo perché 'raise SystemExit' ee 'sys.exit' sono fondamentalmente [lo stesso] (https://stackoverflow.com/q/36302165/321973) –