我尝试使用线程在Python中创建HTTP服务器:
from SocketServer import ThreadingMixIn
from BaseHTTPServer 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()
服务器运行良好,但如果两个请求同时发生,则按顺序执行。 所以第二个请求直到第一个请求完成才执行。 谢谢!!
答案 0 :(得分:0)
您的代码完全适用于python中的多线程。我没有理由认为这是顺序的。您可能想尝试随机睡眠间隔。
BTW:Python线程与OS线程不同。普通的python脚本在单进程,单线程VM中运行,因此只有一个python线程可以随时运行。 (如果你想了解更多信息:查看GIL)您可以尝试使用PyPy进行真正的多线程
答案 1 :(得分:0)
Python是围绕一个名为全局解释器锁(GIL)的构造设计的,它确保在任何给定时间只运行一条python指令。这意味着Python无法并行运行代码,这就解释了为什么您的代码是串行运行的。您可以阅读有关GIL here的更多信息。
如果您想回避GIL,可以选择一个选项:查看multiprocessing包。
答案 2 :(得分:0)
我碰到了同样的问题,发现了这个古老的问题。原来,对我来说问题是我使用谷歌浏览器,它似乎将请求序列化到同一个URL。因此第二个请求在第一个请求没有响应之前就没有发送,因此服务器似乎是按顺序处理请求。使用curl -i <your URL here>
效果更好。
答案 3 :(得分:0)
这是绝对正确的: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: streaming HTTP server supporting multiple connections on one port