带有多线程响应处理程序的Python http服务器

带有多线程响应处理程序的Python http服务器,python,multithreading,http,basehttpserver,Python,Multithreading,Http,Basehttpserver,我正在尝试设置一个处理POST数据包的python服务器。 一旦数据包到达,do_POST将使用self和一些数据初始化一个新线程, 然后,线程执行一些操作,并将收到的输出放入self对象中。 这就是我到目前为止所做的: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer .... class httpHandler(BaseHTTPRequestHandler): def do_POST(self):

我正在尝试设置一个处理POST数据包的python服务器。 一旦数据包到达,do_POST将使用self和一些数据初始化一个新线程, 然后,线程执行一些操作,并将收到的输出放入self对象中。 这就是我到目前为止所做的:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
....
class httpHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers['content-length'])
        data = self.rfile.read(length)
        Resolver(self,data).start()
        return
然后,在我的解析器类中,我执行以下操作: 导入线程

class Resolver(threading.Thread):
    def __init__(self,http,number):
        threading.Thread.__init__(self)
        self.http = http
        self.number = number + "!"

    def run(self):
        self.http.send_response(200)
        self.http.send_header('Content-type','text/html')
        self.http.send_header('Content-length', len(self.number))
        self.http.end_headers()
        # Send the html message
        self.http.wfile.write(self.number)
        return
当然,这只是一个例子,并不是完整的表单,我仍然在测试我的程序。 它将在一个薄弱的平台上运行(目前是Raspberry pi),我正在寻找一个性能良好的解决方案。
有什么建议吗?

这不是正确的方法。现在,您向其发送请求的每个线程都将“同时”通过HTTP服务器写入响应。您可以添加锁定,但这基本上仍无法达到目的

Python已经提供了一种简单的内置方法来实现这一点
BaseHTTPServer.HTTPServer
SocketServer.TCPServer
的一个子类,因此您只需使用
SocketServer.ThreadingMixIn
。Python文档在这里给出了一个示例:


我确信已经有这样的例子了。

问题是
BaseHTTPRequestHandler
希望您在从
do\u POST
返回时完成请求。这在文档中并不是很清楚,但如果您查看调用您的方法的源代码,就会发现这一点:

mname = 'do_' + self.command
# ...
method = getattr(self, mname)
mname()
self.wfile.flush() #actually send the response if not already done.
如果深入研究,您会发现,正如您所期望的那样,代码期望在完成处理请求后能够关闭或重用连接

因此,不能以这种方式使用
BaseHTTPRequestHandler

当然,您可以编写自己的处理程序实现。在很大程度上,
BaseHTTPServer
中的内容更多的是作为示例代码,而不是作为一个强大、高效、健壮和灵活的框架(这就是文档直接链接到源代码的原因)

或者,不要试图为每个请求创建一个线程,只需为每个连接创建一个线程即可。这门课很容易做到


但更好的解决方案是使用更好的框架,如Twisted或Tornado,或者使用一个Web服务器,它为您执行线程,并通过WSGI调用您的代码。

您真的需要每个请求一个线程,而不是每个连接一个线程吗(哪一个可以只使用内置的
TheadingMixIn
而不尝试手动实现)?好的,大范围是这样的:我运行连接的主类拥有一个db连接(使用pycopg2模块)每个新的post数据包到达时都会收到一个游标。然后,对请求进行分析,然后在响应数据包中返回输出。我在某个地方读到ThreadingMixIn非常慢。因此,我不敢相信这一点。如果我错了,请纠正我。每个连接通常都很短:请求一些东西,得到结果,然后完成多次threPython中的ads通常不是很好。但是,如果线程的目的是与数据库连接进行通信,那么至少在每个请求处理程序与数据库进行通信时,它应该允许其他线程运行。尝试自己执行并不会使其更快:/n如果您只是使用同时做大量I/O绑定的工作是很糟糕的。如果你想并行做大量CPU绑定的工作并获得多核系统的好处,那就太糟糕了。不管你是使用
ThreadingMixIn
还是你自己的线程代码,都是一样的。但是
ThreadingMixIn
仍然有一个优势:I将其替换为
ForkingMixIn
,这是一个微不足道的改变,对于围绕
threading
模块编写的自定义代码来说,这肯定不是真的……另外,自定义编写的代码更可能出现错误,特别是如果您是处理并发性的新手。顺便说一句,我将为Tornado添加+1,因为它非常容易入门。什么我不是那种通过WSGI运行python代码的服务器吗?我不太了解。你是说PHP/Apache服务器吗?我应该开始使用Tornado而不是python的BaseHTTPServer类吗?还有……Tornado是一个比ThreadingMixIn更好的框架吗?嗯,没有必要使用“PHP/Apache”没有PHP模块的.Apache也可以,因为您不想运行任何PHP代码。nginx或其他任何东西也可以。您甚至可能在设备上内置了一个服务器,只需要配置(或者最坏的情况下添加一个WSGI模块)。谢谢。我将从ThreadingMixIn开始。我对WSGI一无所知。因为我不需要太多的web服务模块,也许ThreadMixIn或Tornado@e-r-a-n:WSGI基本上是CGI的一个更好的版本。您有一个处理连接、异步/线程化/分叉等的web服务器。当用户点击某个URL时,它会使用您的Python脚本生成响应,该脚本是您必须编写的唯一代码。