2012-11-28 11 views
6

Potrzebuję alternatywy, aby zabić skrypt Pythona, podczas gdy funkcja wątku. Moją intencją jest zabicie serwera, gdy klient wprowadzi 0 ... Czy to nie działa, ponieważ wątki nie zostały przerwane? Tu jest mój kodu:Dlaczego metody sys.exit(), exit(), nie działają 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() 

Odpowiedz

8

Problem polega na tym, że wszystkie sys.exit() robi jest podniesienie SystemExit. Ponieważ dzieje się to w wątku roboczym, efektem jest zatrzymanie tego wątku (wyjątki nie rozprzestrzeniają się w wątkach).

Możesz spróbować sygnalizować główny wątek, który skrypt musi zakończyć, albo za pomocą jakiegoś mechanizmu własnego, lub dzwoniąc pod numer thread.interrupt_main().

Aby uzyskać podejście do młota, należy zadzwonić pod numer os._exit().

+0

Importuję os, ale podczas próby "os._exit()" pojawia się błąd: Traceback (ostatnie ostatnie połączenie): Plik "server.py", wiersz 35, w clientThread os._exit(); NameError: globalna nazwa "os" nie jest zdefiniowana –

+1

@CSGamer: Gdzie dodano import? Jesteś pewien, że nie masz literówki? Ponieważ nie ma powodu, który nie powinien działać. – abarnert

+0

Oto mój import na górze: 'import os import sys import import *' –

-3

Możesz po prostu raise SystemExit, ale wydaje się to bardzo trudne. Być może niektóre sposoby współpracy wątków będzie działać (tj .: kolejka z wartownika)

+4

podniesienie SystemExit również nie zabija skryptu. Tylko wątek, który go nazywa ... –

+0

To dlatego, że 'raise SystemExit' i oraz' sys.exit' są w zasadzie [takie same] (https://stackoverflow.com/q/36302165/321973) –

Powiązane problemy