为什么方法sys.exit(),exit(),提升SystemExit不起作用?

时间:2012-11-28 18:59:44

标签: python multithreading sockets exit sys

我需要在线程函数内部杀死python脚本的替代方法。我的意图是当客户端输入0时杀死服务器...这是不行的,因为线程还没有被终止?这是我的代码:

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

2 个答案:

答案 0 :(得分:9)

问题是所有sys.exit()都会提升SystemExit。由于这发生在工作线程中,效果是停止该线程(异常不会跨线程传播)。

您可以通过自己的某种机制或通过调用thread.interrupt_main()来尝试向脚本需要终止的主线程发送信号。

对于大锤方法,请致电os._exit()

答案 1 :(得分:-3)

你可以raise SystemExit,但这似乎非常严厉。也许某种合作线程可以起作用(即:带有哨兵的队列)