Python的ThreadingMixin与BaseHTTPServer

3 投票
1 回答
8414 浏览
提问于 2025-04-17 09:56

我正在评估各种编程语言,以构建一个体积小、处理能力强的应用服务器。这个服务器需要完成一些小任务,比如接收请求、从一个运行缓存应用(像memcached或redis)的独立服务器读取数据,然后返回5到10行的XML或JSON。它的处理能力要求非常高,至少要能在生产环境中每秒处理1000个请求。我现在使用的是Nginx和PHP,但memcached在返回所有所需数据时需要超过5毫秒,这样就会有一些网络输入输出的延迟。

我在查看Python的BaseHTTPServer类。虽然我不是Python高手,但我想了解它背后的工作原理。如果你查看这个页面 -

http://docs.python.org/library/socketserver.html

上面提到“要构建异步处理程序,请使用ThreadingMixIn和ForkingMixIn类。”

这真的是异步的吗?还是说它是为每个客户端启动一个线程?如果是每个客户端一个线程的模型,那这些线程是操作系统级别的线程吗?如果我坚持使用每个客户端一个线程的模型,Python的垃圾回收(GC)能否在我给它提供高内存、8核的亚马逊实例时快速清理资源?

1 个回答

6

在源代码中,你可以看到ForkingMixIn会真正地进行进程分叉。而ThreadingMixIn则是使用Python的线程。所以你需要处理GIL(全局解释器锁),这意味着即使它使用了底层的操作系统线程机制,你的Python线程也不会并行处理。我不建议在高吞吐量的服务器上使用它。

简单来说:,根据你的定义,它们并不是异步的。如果你想要“真正的”异步功能(在一个核心/进程/线程中),你应该看看TwistedTornado,或者也许是Gunicorn。后者可能也不符合你对异步的定义。

我建议使用Tornado配合nginx。关于如何设置的帖子可以在Google Groups找到。因为内部的Tornado服务器没有实现所有标准,你可以使用一个“真正的”服务器作为代理。

撰写回答