【问题标题】:A good multithreaded python webserver?一个好的多线程 python 网络服务器?
【发布时间】:2010-09-17 19:52:51
【问题描述】:

我正在寻找一个多线程而不是多进程的 python 网络服务器(例如 mod_python for apache)。我希望它是多线程的,因为我想要一个内存对象缓存,供各种 http 线程使用。我的网络服务器做了很多昂贵的事情并计算了一些需要缓存在内存中以备将来使用以避免重新计算的大型数组。这在多进程 Web 服务器环境中是不可能的。将这些信息存储在 memcache 中也不是一个好主意,因为数组很大,并且将它们存储在 memcache 中会导致来自 memcache 的数据被反序列化,除了 IPC 的额外开销。

我使用 BaseHttpServer 实现了一个简单的网络服务器,它提供了良好的性能,但几个小时后就卡住了。我需要一些更成熟的网络服务器。是否可以将 apache 配置为在线程模型下使用 mod_python 以便我可以进行一些对象缓存?

【问题讨论】:

    标签: python apache webserver mod-python


    【解决方案1】:

    也许您在 Python 中使用 BaseHttpServer 的实现存在问题。它没有理由“卡住”,使用BaseHttpServerthreading 实现一个简单的线程服务器应该不难。

    另外,请参阅http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer,了解使用HTTPServerThreadingMixIn 实现一个简单的多线程服务器

    【讨论】:

      【解决方案2】:

      我最近实际上遇到了同样的问题。即:我们使用 BaseHTTPServer 编写了一个简单的服务器,发现它不是多线程的事实是一个很大的缺点。

      我的解决方案是将服务器移植到 Pylons (http://pylonshq.com/)。移植相当简单,一个好处是使用 Pylons 创建 GUI 非常容易,因此我能够在基本上是守护进程的顶部抛出一个状态页面。

      我会这样总结 Pylons:

      • 它与 Ruby on Rails 的相似之处在于它旨在非常容易地部署 Web 应用程序
      • 它的默认模板语言 Mako 非常适合使用
      • 它使用了一个非常方便的路由 url 系统
      • 对我们来说性能不是问题,所以我不能保证 Pylons 能够充分满足您的需求
      • 您可以将它与 Apache 和 Lighthttpd 一起使用,尽管我没有尝试过

      我们还使用 Twisted 运行了一个应用程序,并且对它感到满意。 Twisted 有很好的性能,但我发现 Twisted 的单线程/延迟到线程编程模型相当复杂。它有很多优点,但对于一个简单的应用程序来说,我不会选择它。

      祝你好运。

      【讨论】:

        【解决方案3】:

        web.py 过去让我很开心。考虑检查一下。

        但听起来架构重新设计可能是正确的解决方案,但成本更高。

        【讨论】:

          【解决方案4】:

          Twisted 可以作为这样的网络服务器。虽然本身不​​是多线程的,但当前主干中存在一个(尚未发布的)多线程 WSGI 容器。您可以查看 SVN 存储库,然后运行:

          twistd web --wsgi=your.wsgi.application
          

          【讨论】:

            【解决方案5】:

            如果不知道您正在处理什么样的网站以及您期望什么样的负载,很难给出明确的答案。亚秒级性能可能是一个严格的要求,也可能不是。如果您真的需要保存最后一毫秒,那么您绝对需要将数组保存在内存中。但是,正如其他人所建议的那样,您很可能不会并且可以通过其他方式来解决问题。您对数组中数据的使用模式可能会影响您做出的选择。您可能不需要一次访问数组中的整个数据集,因此您可以将数据分成更小的块并将这些块放入缓存中,而不是一个大块。根据您的阵列数据需要更新的频率,您可以在 memcached、本地数据库(berkley、sqlite、小型 mysql 安装等)或远程数据库之间做出选择。我会说 memcached 用于相当频繁的更新。本地数据库以每小时为频率,远程以每天为频率。还要考虑的一件事是缓存未命中后会发生什么。如果 50 个客户端突然出现缓存未命中并且所有客户端同时决定开始重新生成那些昂贵的阵列,那么您的盒子将很快减少到 8086 个。所以你必须考虑你将如何处理它。那里的许多文章都介绍了如何从缓存未命中中恢复。希望这会有所帮助。

            【讨论】:

              【解决方案6】:

              只是为了指出一些与通常的嫌疑人不同的东西......

              几年前,当我使用Zope 2.x 时,我读到了Medusa,因为它是用于该平台的网络服务器。他们宣传它可以在重负载下正常工作,并且可以为您提供您所要求的功能。

              【讨论】:

              • Medusa 是一个古老且可能已不复存在的项目。 Twisted 是这里更好的选择。
              【解决方案7】:

              考虑重新考虑您的设计。在您的网络服务器中维护这么多状态可能是个坏主意。多进程是获得稳定性的更好方法。

              还有其他方法可以在不同进程之间共享状态吗?服务呢?数据库?指数?

              在内存中维护大量数据并依靠单个多线程进程来处理您的所有请求似乎不太可能是您应用的最佳设计或架构。

              【讨论】:

              • 类似数据库的后端比线程间共享数据要好得多。 Web 事务和“一些大型数组”之间的简单 RESTful 交互可能更容易管理。
              【解决方案8】:

              CherryPy。网站列出的功能:

              • 一个快速的、符合 HTTP/1.1 的、WSGI 线程池网络服务器。通常,CherryPy 本身每页只需要 1-2 毫秒!
              • 支持任何其他支持 WSGI 的网络服务器或适配器,包括 Apache、IIS、lighttpd、mod_python、FastCGI、SCGI 和 mod_wsgi
              • 轻松同时运行多个 HTTP 服务器(例如在多个端口上)
              • 适用于开发人员和部署人员的强大配置系统
              • 灵活的插件系统
              • 用于缓存、编码、会话、授权、静态内容等的内置工具
              • 本机 mod_python 适配器
              • 完整的测试套件
              • 可交换和可定制...应有尽有。
              • 内置分析、覆盖和测试支持。

              【讨论】:

                【解决方案9】:

                您可以改为使用可从每个进程访问的分布式缓存,memcached 是我想到的示例。

                【讨论】:

                • 更好的是,python 应用程序可以为 memcached 提供完整的 HTML 页面,并有一个前端服务器(如 nginx)从那里拉取,仅在缓存失败时调用 webapp(通过 FastCGI),或者POST 请求
                【解决方案10】:

                我个人和专业都使用 CherryPy,对此我感到非常满意。我什至做了你描述的那种事情,比如拥有全局对象缓存,在后台运行其他线程等等。它与 Apache 集成得很好;只需将 CherryPy 作为绑定到 localhost 的独立服务器运行,然后使用 Apache 的 mod_proxymod_rewrite 让 Apache 透明地将您的请求转发给 CherryPy。

                CherryPy 网站是http://cherrypy.org/

                【讨论】:

                  【解决方案11】:

                  不是多线程的,但twisted 可能满足您的需求。

                  【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-15
                  • 2020-03-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-19
                  • 1970-01-01
                  相关资源
                  最近更新 更多