2

我尝试使用 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()

服务器运行良好,但如果两个请求是同一时间,它们会按顺序执行。所以第二个请求在第一个请求完成之前不会执行。

4

4 回答 4

1

这是绝对正确的: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 服务器

于 2017-09-14T07:08:03.250 回答
0

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

如果您想避开 GIL,那么您可以使用一个选项:查看multiprocessing包。

于 2014-03-15T08:16:56.393 回答
0

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

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

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

于 2014-03-15T07:31:32.627 回答
0

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

于 2015-08-11T06:21:56.243 回答