[英]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 中的多线程。 我看不出为什么这会是连续的。 您可能想尝试随机睡眠间隔。
顺便说一句:Python 线程与 OS 线程不同。 普通的python 脚本运行在单进程、单线程的VM 中,因此任何时候都只能运行一个python 线程。 (如果您想了解更多信息:查找 GIL)
您可以尝试使用 PyPy 进行真正的多线程
我遇到了同样的问题,发现了这个古老的问题。 原来,对我来说,问题是我使用的是 Google Chrome,它似乎将请求序列化到相同的 URL。 所以第二个请求在第一个请求得到响应之前不会发送,因此服务器似乎在按顺序处理请求。 使用curl -i <your URL here>
效果更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.