2015-04-27 65 views
0

我想在python中创建一个多线程服务器,它现在发送一个标题行,然后请求html文件,但是我遇到了一点障碍。我很确定我的线程在函数完成时不会退出。我的服务器正在打印“准备投放......”的次数超过应有的次数(并且偶尔遇到随机错误)。我听说如果一个线程遇到一个处理的异常,它可能不会退出,但即使事情顺利运行,它似乎也不会退出。在python多线程服务器中退出线程

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

回答

0

它打印出“准备服务器”不止一次的原因是,你把print 'Ready to serve...'的循环。如果您只希望打印一次,请将其放在循环之外。

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

print('Ready to serve...') 
while True: 
    #Establish the connection 
    try: 
     connectionSocket, addr = serverSocket.accept() 
    except KeyboardInterrupt: 
     break 
    t = threading.Thread(target=work, args=(connectionSocket,)) 
    threads.append(t) 
    t.start() 

print("Exiting") 
for t in threads: 
    t.join(5) 
serverSocket.close() 
+0

谢谢!我知道我已经在循环中“准备好服务......”,但我期望它能够按照每个请求再次打印一次,但是在每次请求之后打印两次或更多,这导致我相信该线程不会退出并返回到循环主线程已经在哪里,并与它同时循环。 – boxofun1

+0

随着你的代码,我绝对不会再有任何错误,但它仍然打印准备好每次请求多次服务......再次,谢谢你! – boxofun1