Python ThreadingMixin和BaseHTTPServer

时间:2012-01-10 13:33:01

标签: python multithreading web-services webserver threadpool

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

我在查看Python的BaseHTTPServer类。我不是一个python大师,但我需要知道它在幕后的工作原理。如果您阅读本页 -

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

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

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

1 个答案:

答案 0 :(得分:3)

正如你在源代码中看到的那样,

ForkingMixIn做了一个真正的分叉。 ThreadingMixIn使用Python线程。所以你必须处理GIL,这意味着即使它使用底层的os-threading机制,也不会有你的p​​ython-threads的并发处理。我不推荐它用于高吞吐量服务器。

简而言之: NO ,根据您的定义,它们不是异步的。如果您想要“真正的”异步(一个核心/进程/线程)功能,您应该查看:TwistedTornadoGunicorn。后者可能无法满足您对异步的定义。

我建议使用nndx的torndado。有一篇关于如何设置的帖子in google groups。由于内部Tornado-Server没有实现所有标准,因此您可以使用“真实”服务器作为代理。