2012-11-28 43 views
6

मुझे थ्रेड फ़ंक्शन के अंदर पाइथन स्क्रिप्ट को मारने के विकल्प की आवश्यकता है। जब मेरा ग्राहक 0 में प्रवेश करता है तो मेरा इरादा सर्वर को मार रहा है ... क्या यह काम नहीं कर रहा है क्योंकि धागे को समाप्त नहीं किया गया है?विधियों sys.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, क्लाइंट में os._exit(); नाम त्रुटि: वैश्विक नाम 'ओएस' परिभाषित नहीं किया गया है –

+1

@CSGamer: आपने आयात कहां जोड़ा? क्या आप सुनिश्चित हैं कि आपके पास टाइपो नहीं है? क्योंकि ऐसा कोई कारण नहीं है जो काम नहीं करना चाहिए। – abarnert

+0

यहां मेरे आयात हैं: 'आयात os आयात sys थ्रेड आयात से * ' –

-3

आप केवल raise SystemExit कर सकते हैं लेकिन यह वास्तव में कठोर लगता है। हो सकता है कि सहकारी थ्रेडिंग का कुछ माध्यम काम करेगा (यानी: एक सेंटीनेल के साथ एक कतार)

+4

सिस्टमएक्सिट बढ़ाएं स्क्रिप्ट को भी मार नहीं देता है। केवल थ्रेड जो इसे कॉल करता है ... –

+0

ऐसा इसलिए है क्योंकि 'सिस्टमएक्सिट' बढ़ाएं और 'sys.exit' मूल रूप से [वही] हैं (https://stackoverflow.com/q/36302165/321973) –