2017-08-20 30 views
0

我想在python中创建多线程的Web服务器,但请求被逐一处理。在搜索几个小时后,我发现这个link,但核准的答案似乎是不正确的,因为那里的请求也是一个接一个地处理的。 下面是代码:Python多线程HTTP服务器不工作

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 
from SocketServer import ThreadingMixIn 
import threading 
from time import sleep 

class Handler(BaseHTTPRequestHandler): 

def do_GET(self): 
    self.send_response(200) 
    self.end_headers() 
    sleep(5) 
    message = threading.currentThread().getName() 
    self.wfile.write(message) 
    self.wfile.write('\n') 
    return 

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): 
    """Handle requests in a separate thread.""" 

if __name__ == '__main__': 
    server = ThreadedHTTPServer(('localhost', 8080), Handler) 
    print 'Starting server, use <Ctrl-C> to stop' 
    server.serve_forever() 

我添加“睡眠(5)”为5秒延迟来处理该请求。之后,我发送多个请求,但所有请求都被逐个处理,每个请求花费5秒钟。我无法找到原因。帮我。

+1

你为什么要自己编写一个Web服务器?已经有很多了。使用gunicorn或uwsgi。 –

+0

你的观察结果不正确。上面显示的代码(当您修复缩进!)按预期工作;它可以开始在新线程中提供GET请求,而其他(s)仍在处理中。我不知道你是如何得出结论,它不起作用。 –

+0

@IrmendeJong先生,缩进没有问题。我进行的测试给了我一个又一个的结果。你可以尝试上面的代码。 –

回答

0

这里的关键要求是能够在send_response和返回的数据之间有5秒的延迟。这意味着你需要流媒体;您不能使用ThreadingMixIngunicorn或任何其他此类攻击。

你需要的东西是这样的:

import time, socket, threading 

sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
host = socket.gethostname() 
port = 8000 

sock.bind((host, port)) 
sock.listen(1) 

HTTP = "HTTP/1.1 200 OK\nContent-Type: text/html; charset=UTF-8\n\n" 

class Listener(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.daemon = True # stop Python from biting ctrl-C 
     self.start() 

    def run(self): 
     conn, addr = sock.accept() 
     conn.send(HTTP) 

     # serve up an infinite stream 
     i = 0 
     while True: 
      conn.send("%i " % i) 
      time.sleep(0.1) 
      i += 1 

[Listener() for i in range(100)] 
time.sleep(9e9)