Python多线程HTTP服务器不起作用

Posted

技术标签:

【中文标题】Python多线程HTTP服务器不起作用【英文标题】:Python multi threading HTTP server not working 【发布时间】:2018-01-28 20:01:38 【问题描述】:

我正在尝试在 python 中创建多线程 Web 服务器,但请求被一一处理。经过几个小时的搜索,我找到了这个link,但批准的答案似乎不正确,因为那里的请求也被一一处理。 代码如下:

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

我添加了“sleep(5)”延迟 5 秒来处理请求。之后我发送了多个请求,但所有请求都被一一处理,每个请求需要 5 秒。我找不到原因。帮帮我。

【问题讨论】:

你为什么要自己写一个网络服务器?已经有很多了。使用 gunicorn 或 uwsgi。 您的观察不正确。如上所示的代码(当您修复缩进时!)按预期工作;它能够在其他线程仍在处理时开始在新线程中提供 GET 请求。我不知道你是如何得出它不起作用的结论的。 @IrmendeJong 先生,缩进没有问题。我进行的测试给了我一个接一个的结果。你可以试试上面的代码。 我做到了,而且效果很好。建议你看看docs.python.org/3.7/library/… 是的,你的代码中有一个缩进错误:“def”应该缩进成为类的一部分 【参考方案1】:

这里的关键要求是能够在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)

【讨论】:

以上是关于Python多线程HTTP服务器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

多部分上传在 QObject 中不起作用移动到线程

套接字:客户端读取消息时多线程不起作用

服务器到客户端多线程 Python

VB6 GUI 在多线程 COM 环境中不起作用

python多线程作用

回调函数不起作用 多线程调试 (/MTd)