2012-11-28 24 views
6

Tôi cần một giải pháp thay thế để diệt tập lệnh python khi đang ở trong một hàm chuỗi. Ý định của tôi là giết chết máy chủ khi khách hàng nhập một 0 ... Đây có phải là không làm việc vì các chủ đề đã không được chấm dứt? Đây là mã của tôi:Tại sao các phương thức sys.exit(), exit(), tăng SystemExit không hoạt động?

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

Trả lời

8

Vấn đề là tất cả sys.exit() làm là nâng SystemExit. Vì điều này xảy ra trong một chuỗi công nhân, hiệu ứng là để ngăn chặn luồng đó (các ngoại lệ không lan truyền qua các luồng).

Bạn có thể thử báo hiệu cho chuỗi chính mà tập lệnh cần chấm dứt, dù là một số cơ chế của riêng bạn hoặc bằng cách gọi thread.interrupt_main().

Để biết cách tiếp cận búa tạ, hãy gọi os._exit().

+0

Tôi nhập os, nhưng khi cố gắng 'os._exit()' tôi nhận được lỗi: Traceback (cuộc gọi gần đây nhất): Tệp "server.py", dòng 35, trong clientThread os._exit(); TênError: tên toàn cầu 'os' không được xác định –

+1

@CSGamer: Bạn đã thêm nhập ở đâu? Bạn có chắc bạn không có lỗi đánh máy không? Bởi vì không có lý do gì mà không nên làm việc. – abarnert

+0

Đây là hàng nhập của tôi ở trên cùng: 'import os nhập sys từ nhập chuỗi *' –

-3

Bạn chỉ có thể raise SystemExit nhưng điều đó có vẻ thực sự khắc nghiệt. Có lẽ một số phương tiện của luồng hợp tác sẽ hoạt động (ví dụ: hàng đợi với một sentinel)

+4

tăng SystemExit cũng không giết tập lệnh. Chỉ có chủ đề gọi nó là ... –

+0

Đó là vì 'nâng SystemExit' và' sys.exit' về cơ bản [giống nhau] (https://stackoverflow.com/q/36302165/321973) –

Các vấn đề liên quan