1

Bottle 在其 wsgiref 服务器实现中做了什么而内置的 Python WSGIref简单服务器不是?例如,当我查看 Bottle 时,它​​遵循 WSGI 标准,并且文档指出:

1.5.1 服务器选项 内置的默认服务器基于wsgiref WSGIServer。这种非线程 HTTP 服务器非常适合开发和早期生产,但当服务器负载增加时可能会成为性能瓶颈。
有三种方法可以消除这个瓶颈:

  • • 使用不同的多线程或异步服务器。
  • • 启动多个服务器进程并使用负载平衡器分散负载。
  • • 两者都做[强调我的]

然而,我读过的所有内容都说不要将 Python wsgrief 服务器用于任何生产。

内置 Python wsgiref 没有,Bottle 对 wsgrief 做了什么?我并没有真正质疑使用异步服务器或“更大”更“可扩展”的 WSGI 服务器是否明智。但是,我想知道 Bottle 对 wsgiref 服务器做了什么,这使得它可以用于“早期生产”,而常规库却没有。

我的应用程序将为不到 20 人提供 PostgreSQL 或 MySQL 数据库、CRUD 操作。我想你可以用 Flask 提出类似的问题。

以供参考,

http://bottlepy.org/docs/dev/bottle-docs.pdf [pdf] https://docs.python.org/2/library/wsgiref.html#module-wsgiref.simple_server https://github.com /bottlepy/bottle/blob/master/bottle.py

这是 Bottle 的实现,至少用于打开端口:

class WSGIRefServer(ServerAdapter):
    def run(self, app):  # pragma: no cover
        from wsgiref.simple_server import make_server
        from wsgiref.simple_server import WSGIRequestHandler, WSGIServer
        import socket

        class FixedHandler(WSGIRequestHandler):
            def address_string(self):  # Prevent reverse DNS lookups please.
                return self.client_address[0]

            def log_request(*args, **kw):
                if not self.quiet:
                    return WSGIRequestHandler.log_request(*args, **kw)

        handler_cls = self.options.get('handler_class', FixedHandler)
        server_cls = self.options.get('server_class', WSGIServer)

        if ':' in self.host:  # Fix wsgiref for IPv6 addresses.
            if getattr(server_cls, 'address_family') == socket.AF_INET:

                class server_cls(server_cls):
                    address_family = socket.AF_INET6

        self.srv = make_server(self.host, self.port, app, server_cls,
                               handler_cls)
        self.port = self.srv.server_port  # update port actual port (0 means random)
        try:
            self.srv.serve_forever()
        except KeyboardInterrupt:
            self.srv.server_close()  # Prevent ResourceWarning: unclosed socket
            raise
4

1 回答 1

3

编辑:

Bottle 在其 wsgiref 服务器实现中做了什么而内置的 Python WSGIref 简单服务器不是?

内置 Python wsgiref 没有,Bottle 对 wsgrief 做了什么?

没有(实质)。


不确定我是否理解您的问题,但我会尽力提供帮助。

我感到困惑的原因是:您发布的代码片段准确地回答了[我认为是]您的问题。WSGIRefServer除了 wrap 之外,Bottle 的类没有做任何实质性的事情wsgiref.simple_server。(我称日志记录和 IPv6 调整无关紧要,因为它们与“生产就绪”无关,我认为这是您问题的核心。)

您是否可能误解了文档?我想也许是的,因为你说:

我想知道 Bottle 对 wsgiref 服务器做了什么,这使得它可以用于“早期生产”,而常规库却没有。

但是瓶子文档指出瓶子WSGIRefServer不应该用于处理高吞吐量负载。

换句话说,WSGIRefServer相同wsgiref而我认为您将文档解释为前者在某种程度上比后者有所改进。(它不是。)

希望这可以帮助!

于 2016-01-27T14:22:32.350 回答