Python ThreadingMixin 和 BaseHTTPServer

Adi*_*ngh 3 python webserver multithreading web-services threadpool

我正在尝试评估各种语言来构建小型高吞吐量应用程序服务器。它需要做一些小事情,比如获取请求、从运行缓存应用程序(memcached、redis)的单独服务器读取数据,以及发回 5 - 10 行 XML 或 JSON。生产吞吐量非常高,至少每秒 1000 个。我在 Nginx 上有这个 - PHP 和 memcached 需要 5+ 毫秒才能发回所有所需的数据,因此存在一些网络 IO 阻塞。

我正在查看 Python 的 BaseHTTPServer 类。我不是Python专家,但我需要知道它在幕后是如何工作的。如果您阅读此页 -

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

它说“要构建异步处理程序,请使用 ThreadingMixIn 和 ForkingMixIn 类。”

它真的是异步的还是每个客户端启动一个线程。如果每个客户端模型在一个线程上 - 这些是操作系统级别的线程吗?如果我坚持每个客户端模型一个线程,如果我给它高 RAM、8 核亚马逊实例,Python 的 GC 清除东西的速度是否足够快。

Don*_*ion 6

正如您在源代码中看到的那样, ForkingMixIn进行了真正的分叉。ThreadingMixIn使用 Python 线程。所以你必须处理 GIL,这意味着即使它使用底层操作系统线程机制,你的 python 线程也不会并发处理。我不会推荐它用于高吞吐量服务器。

简而言之:,根据您的定义,它们不是异步的。如果您想要“真正的”异步(一个核心/进程/线程)功能,您应该研究:TwistedTornado或可能Gunicorn。后者可能也不符合您对异步的定义。

我建议将torndado与nginx一起使用。谷歌群组里有一篇关于如何设置的帖子。因为内部 Tornado-Server 没有实现所有标准,所以您可以使用“真实”服务器作为代理。