Python HTTP-Server和线程

时间:2014-03-15 07:26:23

标签: python multithreading basehttpserver

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

服务器运行良好,但如果两个请求同时发生,则按顺序执行。 所以第二个请求直到第一个请求完成才执行。 谢谢!!

4 个答案:

答案 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