優れたマルチスレッドPython Webサーバーですか?
-
03-07-2019 - |
質問
(apacheのmod_pythonの場合のように)マルチプロセスではなくマルチスレッドのpythonウェブサーバーを探しています。さまざまなhttpスレッドで使用されるインメモリオブジェクトキャッシュが必要なため、マルチスレッド化する必要があります。私のウェブサーバーは多くの高価なものを実行し、再計算を避けるために将来の使用のためにメモリにキャッシュする必要があるいくつかの大きな配列を計算します。これは、マルチプロセスWebサーバー環境では不可能です。配列が大きいため、この情報をmemcacheに格納することもお勧めできません。配列をmemcacheに格納すると、IPCの追加オーバーヘッドとは別に、memcacheからのデータの逆シリアル化が発生します。
BaseHttpServerを使用して簡単なWebサーバーを実装しましたが、パフォーマンスは良好ですが、数時間後にスタックします。もっと成熟したウェブサーバーが必要です。オブジェクトキャッシュを実行できるように、スレッドモデルでmod_pythonを使用するようにApacheを構成することは可能ですか?
解決
CherryPy 。ウェブサイトにリストされている機能:
- HTTP / 1.1に準拠した高速のWSGIスレッドプールWebサーバー。通常、CherryPy自体は1ページあたり1〜2ミリ秒しかかかりません!
- Apache、IIS、lighttpd、mod_python、FastCGI、SCGI、mod_wsgiなど、他のWSGI対応ウェブサーバーまたはアダプターのサポート
- 一度に複数のHTTPサーバー(複数のポートなど)を簡単に実行できます
- 同様に開発者とデプロイヤ向けの強力な構成システム
- 柔軟なプラグインシステム
- キャッシュ、エンコード、セッション、認証、静的コンテンツなどのための組み込みツール
- ネイティブmod_pythonアダプター
- 完全なテストスイート
- スワップ可能およびカスタマイズ可能...すべて。
- 組み込みのプロファイリング、カバレッジ、およびテストのサポート。
他のヒント
デザインの再検討を検討してください。ウェブサーバーでそのような状態を維持することは、おそらく悪い考えです。マルチプロセスは、安定性を高めるためのはるかに優れた方法です。
別のプロセス間で状態を共有する別の方法はありますか?サービスはどうですか?データベース?インデックス?
メモリ内の膨大なデータの配列を維持し、すべての要求を処理するために単一のマルチスレッドプロセスに依存することは、アプリの最適な設計またはアーキテクチャではないようです。
Twisted は、このようなWebサーバーとして機能します。マルチスレッドではありませんが、現在のトランクには(まだリリースされていない)マルチスレッドWSGIコンテナーが存在します。 SVNリポジトリをチェックアウトしてから実行できます:
twistd web --wsgi=your.wsgi.application
作業しているサイトの種類と、予想している負荷の種類を知らずに決定的な答えを出すのは困難です。 1秒未満のパフォーマンスは重大な要件になる場合もあれば、そうでない場合もあります。最後のミリ秒を本当に保存する必要がある場合は、配列をメモリに保持する必要があります。しかし、他の人が示唆しているように、あなたはそうしない可能性が高く、他のものでうまくいく可能性があります。配列内のデータの使用パターンは、選択の種類に影響する場合があります。おそらく、配列のデータセット全体に一度にアクセスする必要はないので、データを小さなチャンクに分割し、それらのチャンクを1つの大きな塊ではなくキャッシュに入れることができます。配列データを更新する必要がある頻度に応じて、memcached、ローカルデータベース(berkley、sqlite、小さなmysqlインストールなど)、またはリモートデータベースを選択できます。かなり頻繁に更新される場合は、memcachedと言います。 1時間ごとの頻度のローカルデータベースと1日ごとの頻度のリモートデータベース。考慮すべきことの1つは、キャッシュミス後に何が起こるかです。 50のクライアントが突然すべてのキャッシュミスを取得し、それらすべてが同時にそれらの高価なアレイの再生成を開始することを決定した場合、ボックスはすぐに8086に削減されます。そのため、それをどのように処理するかを検討する必要があります。キャッシュミスから回復する方法については、多くの記事で取り上げられています。これがお役に立てば幸いです。
マルチスレッドではありませんが、ツイストでニーズを満たすことができます。
代わりに、各プロセスからアクセス可能な分散キャッシュを使用できます。 memcached が例です思い浮かびます。
web.pyは過去に私を幸せにしました。チェックしてみてください。
ただし、アーキテクチャの再設計が適切であるように聞こえますが、より高価なソリューションです。
おそらく、 BaseHttpServer
を使用したPythonの実装に問題があります。 「行き詰まる」理由はありません。 BaseHttpServer
と threading
を使用して簡単なスレッドサーバーを実装することは難しくありません。
また、 http://pymotw.com/2/BaseHTTPServer/をご覧ください。 index.html#module-BaseHTTPServer HTTPServer
および ThreadingMixIn
CherryPyは個人的にも専門的にも使用していますが、非常に満足しています。グローバルオブジェクトキャッシュを持っている、バックグラウンドで他のスレッドを実行しているなど、あなたが説明しているようなこともしています。 localhostにバインドされたスタンドアロンサーバーとしてCherryPyを実行し、Apacheの mod_proxy
と mod_rewrite
を使用して、Apacheが透過的にリクエストをCherryPyに転送するようにします。
CherryPy Webサイトは http://cherrypy.org/
です。最近、実際に同じ問題が発生しました。つまり、BaseHTTPServerを使用して簡単なサーバーを作成し、マルチスレッドではないという事実が大きな欠点であることがわかりました。
私の解決策は、サーバーをPylonsに移植することでした( http://pylonshq.com/ )。移植は非常に簡単で、Pylonsを使用してGUIを作成するのが非常に簡単だったため、基本的にデーモンプロセスの上にステータスページを表示できました。
このようにPylonsを要約します:
- Webアプリのデプロイを非常に簡単にすることを目指している点で、Ruby on Railsに似ています
- これはデフォルトのテンプレート言語であるMakoで、とても便利です
- 非常に便利なルーティングURLシステムを使用します
- 私たちにとってパフォーマンスは問題ではないので、Pylonsがあなたのニーズに対して適切に動作することを保証することはできません
- Apache&で使用できます。 Lighthttpd、私はこれを試していませんが
また、Twistedでアプリを実行し、満足しています。 Twistedのパフォーマンスは優れていますが、Twistedのシングルスレッド/遅延からスレッドへのプログラミングモデルはかなり複雑であることがわかりました。これには多くの利点がありますが、単純なアプリには私の選択ではありません。
がんばって。