2012-11-28 28 views
6

İplik işlevinin içinde python komut dosyasını öldürmek için bir alternatife ihtiyacım var. İstemci 0 girdiğinde, niyetim sunucuyu öldürüyor ... Bu iş parçacığı sonlandırılmadığı için çalışmıyor mu? Sorun tüm sys.exit() yapmasıdırNeden sys.exit(), exit() yöntemleri, SystemExit'i yükseltmiyor?

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

cevap

8

SystemExit yükseltmek geçerli: İşte benim kodudur. Bu bir iş parçacığı içinde gerçekleştiği için, etki bu iş parçacığını durdurmaktır (istisnalar iş parçacıkları boyunca yayılmaz).

Komut dizisinin, kendi başına bir mekanizma olsa da veya thread.interrupt_main() numaralı telefonu arayarak sonlandırması gereken ana iş parçacığına sinyal göndermeyi deneyebilirsiniz.

Balyoz yaklaşımı için os._exit() numaralı telefonu arayın.

+0

I import os, ancak 'os._exit()' dosyasını denerken hata alıyorum: Traceback (son çağrı son): ClientThread os._exit() dosyasında "server.py", satır 35; NameError: global adı 'os' tanımlı değil –

+1

@CSGamer: İçe aktarmayı nereye eklediniz? Yazım hatası olmadığından emin misin? Çünkü işe yaramaması için bir sebep yok. – abarnert

+0

İşte benim ithalatım üstte: 'import os içe aktarma sys içe aktarma sys –

-3

Sadece raise SystemExit yapabilirsiniz, ancak bu gerçekten zor görünüyor. Belki kooperatif iş parçacığının bazı araçları işe yarayabilir (yani: bir nöbetçi ile bir kuyruk)

+4

yükselt SystemExit betiği de öldürmez. Sadece onu çağıran iş parçacığı ... –

+0

Çünkü 'SystemExit'i yükselt ve' sys.exit 'temelde [aynı] (https://stackoverflow.com/q/36302165/321973) –