繁体   English   中英

Python HTTP 服务器和线程

[英]Python HTTP-Server and Threading

我尝试使用线程在 Python 中创建一个 HTTP 服务器:

from socketserver import ThreadingMixIn
from http.server import HTTPServer, BaseHTTPRequestHandler
import time, threading

class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass
class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        print("do")
        time.sleep(10)
        message =  threading.currentThread().getName()
        self.wfile.write(message)
        self.wfile.write('\n')

if __name__ == "__main__":
    httpd = ThreadingServer( (host, port), Handler)
    httpd.serve_forever()

服务器运行良好,但如果两个请求同时进行,则它们会依次执行。 所以第二个请求直到第一个请求完成才执行。

这是绝对正确的: ThreadingMixIn将使您的整个处理程序有序。

相反,你需要这样的东西:

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)

您甚至可以在不编写自己的 HTTP 服务器的情况下使用上述方法:

Python 2.7:流式 HTTP 服务器支持一个端口上的多个连接

您的代码非常适合 Python 中的多线程。 我看不出为什么这会是连续的。 您可能想尝试随机睡眠间隔。

顺便说一句:Python 线程与 OS 线程不同。 普通的python 脚本运行在单进程、单线程的VM 中,因此任何时候都只能运行一个python 线程。 (如果您想了解更多信息:查找 GIL)

您可以尝试使用 PyPy 进行真正的多线程

Python 是围绕一种称为全局解释器锁 (GIL) 的结构设计的,它确保在任何给定时间只运行一条 Python 指令。 这意味着 Python 不能并行运行代码,这就解释了为什么您的代码要串行运行。 您可以在此处阅读有关 GIL 的更多信息。

如果您想避开 GIL,那么您可以选择一个选项:查看多处理包。

我遇到了同样的问题,发现了这个古老的问题。 原来,对我来说,问题是我使用的是 Google Chrome,它似乎将请求序列化到相同的 URL。 所以第二个请求在第一个请求得到响应之前不会发送,因此服务器似乎在按顺序处理请求。 使用curl -i <your URL here>效果更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM