組み込みの Python WSGIrefシンプル サーバーにはない、wsgiref サーバー実装でのボトルの動作は何ですか? たとえば、Bottle を見ると、WSGI 標準に準拠しており、ドキュメントには次のように記載されています。
1.5.1 サーバー オプション 組み込みのデフォルト サーバーは、wsgiref WSGIServer に基づいています。この非スレッド HTTP サーバーは、開発や初期の運用には問題ありませんが、サーバーの負荷が増加するとパフォーマンスのボトルネックになる可能性があります。
このボトルネックを解消するには、次の 3 つの方法があります。
- • マルチスレッドまたは非同期の別のサーバーを使用します。
- • 複数のサーバー プロセスを開始し、ロード バランサーを使用して負荷を分散します。
- • 両方を行う [私のものを強調]
それでも、私が読んだすべてのことは、Python wsgrief サーバーをプロダクションに使用しないことを示しています。
組み込みの Python wsgiref ではできないことで、Bottle は wsgrief で何をしますか? 私は、非同期サーバーや「より大きな」「スケーラブル」な WSGI サーバーを使用することの賢明さについて疑問を抱いているわけではありません。しかし、Bottle が wsgiref サーバーで何を行っているかを知りたいのですが、これにより「初期の運用」に問題がなくなりますが、通常のライブラリでは問題がありません。
私のアプリケーションは、PostgreSQL または MySQL データベース、CRUD 操作をヒットする 20 人未満の人にサービスを提供します。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 /ボトルピー/ボトル/ブロブ/マスター/ボトル.py
これは、少なくともポートを開くためのボトルの実装です。
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