退出python多线程服务器中的线程

时间:2015-04-27 01:26:49

标签: python multithreading

我现在试图在python中创建一个多线程服务器,它发送一个标题行,然后发送请求的html文件,但我遇到了一些麻烦。我非常确定我的线程在功能完成时没有退出。我的服务器正在打印"准备服务......"比它应该多的次数(并且不时遇到随机错误)。我听说如果一个线程遇到一个处理过的异常,它可能不会退出,但即使事情顺利运行也没有例外,它似乎不会退出。

我对python很新,我习惯在C中制作这些,我可以简单地从线程中退出线程但我的研究告诉我在python中并不那么简单。任何有关如何修复或改进服务器的帮助都会很棒!

#import socket module
from socket import *
import threading

def work(connectionSocket):
    try:
        message = connectionSocket.recv(1024)
        filename = message.split()[1]
        f = open(filename[1:])
        outputdata = f.read()
        #Send one HTTP header line into socket
        connectionSocket.send("Header Line")

        #Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i])
        connectionSocket.close()
    except IOError:
        #Send response message for file not found
        connectionSocket.send("404 File Not Found.")
        connectionSocket.close()

    return

def server():
    threads = []
    serverPort = 14009
    serverSocket = socket(AF_INET, SOCK_STREAM)
    #Prepare a sever socket
    serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    serverSocket.bind(('', serverPort))
    serverSocket.listen(1)
    while True:
        #Establish the connection
        print 'Ready to serve...'
        connectionSocket, addr = serverSocket.accept()
        t = threading.Thread(target=work, args=(connectionSocket,))
        threads.append(t)
        t.start()

    serverSocket.close() 

if __name__ == '__main__':
    server()

1 个答案:

答案 0 :(得分:0)

它不止一次打印出“准备服务器”的原因是你将read-nul mike november oscar < delta.txt 放入循环中。如果您只想打印一次,只需将其放在循环外。

为了确保每个线程都退出,在程序结束时加入所有线程是一种更好的做法。然后代码就像这样:

print 'Ready to serve...'