1

組み込みの 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
4

1 に答える 1

3

編集:

組み込みの Python WSGIref シンプル サーバーにはない、wsgiref サーバー実装でのボトルの動作は何ですか?

組み込みの Python wsgiref ではできないことで、Bottle は wsgrief で何をしますか?

(実体の) 何もありません。


私はあなたの質問を理解しているかどうかわかりませんが、私は助けに突き刺します.

私の混乱の理由は、あなたが投稿したコード スニペットが [私が思うに] あなたの質問に正確に答えているからです。Bottle のWSGIRefServerクラスは、 wrap 以外は何もしませんwsgiref.simple_server。(私はロギングと IPv6 の微調整を実質的でないと呼んでいます。なぜなら、それらは「生産準備状況」とは関係がないためです。私が収集したのは、あなたの質問の中心です。)

ドキュメントを誤解した可能性はありますか?あなたが言うので、私はおそらくイエスだと思います:

通常のライブラリではできない「初期の運用」を可能にする wsgiref サーバーで Bottle が何をしているのかを知りたいです。

しかし、ボトルのドキュメントは、ボトルをWSGIRefServer使用して高スループットの負荷を処理するべきではないことを指摘しています。

言い換えれば、WSGIRefServerと同じですがwsgiref、前者は後者よりも何らかの形で改善されているとドキュメントを解釈したと思います。(そうではありません。)

お役に立てれば!

于 2016-01-27T14:22:32.350 に答える