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