【问题标题】:Python ThreadingMixin and BaseHTTPServerPython ThreadingMixin 和 BaseHTTPServer
【发布时间】:2012-02-06 21:51:54
【问题描述】:

我正在尝试评估各种语言以构建小型高吞吐量应用程序服务器。它需要做一些小事情,比如获取请求、从运行缓存应用程序(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 是否会足够快地清除东西。

【问题讨论】:

    标签: python multithreading web-services webserver threadpool


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了。做了一些研究。如果您处于这种情况,您会使用哪种技术?我需要将 Nginx PHP 移植到其他东西。一些内置 HTTP 服务器的持久应用程序。
    • Tornado 在独立的 Py 应用程序或 Nginx 中?这个基准测试表明 Nginx + Tornado 每秒完成 8000+ 次。 en.wikipedia.org/wiki/Tornado_%28web_server%29
    • @Don 问题:ThreadingMixin 正在使用 threading.thread,它是 AFAIK 一个操作系统级别的线程,在这种情况下它不处理 GIL。这将使 threadingmixin 成为 OP 的理想选择。
    • @RaghuramOntiSrinivasan:尽管使用了真正的操作系统线程,但 CPython 仍然创建了 GIL,以避免任何可能的令人讨厌的意外。如果您想要无 GIL 线程,则必须编写 C-Extension 并手动禁用 GIL。
    • @RaghuramOntiSrinivasan:事实上,“线程”文档中明确指出,CPython 版本使用 GIL! docs.python.org/2/library/threading.html 所以你的假设是错误的。我希望你是对的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2015-05-02
    • 2012-09-05
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多