13

マルチプロセスではなくマルチスレッドのpython Webサーバーを探しています(Apacheのmod_pythonの場合のように)。さまざまなhttpスレッドで使用されるメモリ内オブジェクトキャッシュが必要なため、マルチスレッド化したいと考えています。私のWebサーバーは多くの高価な処理を行い、再計算を避けるために将来使用するためにメモリにキャッシュする必要があるいくつかの大きな配列を計算します. これは、マルチプロセス Web サーバー環境では不可能です。この情報を memcache に保存することもお勧めできません。配列が大きく、それらを memcache に保存すると、IPC の追加のオーバーヘッドとは別に、memcache からのデータのデシリアライズが発生するためです。

BaseHttpServer を使用して単純な Web サーバーを実装しました。パフォーマンスは良好ですが、数時間後にスタックします。もっと成熟したウェブサーバーが必要です。スレッド モデルで mod_python を使用するように apache を構成して、オブジェクト キャッシングを行うことはできますか?

4

11 に答える 11

16

チェリーパイ。ウェブサイトからリストされている機能:

  • 高速で HTTP/1.1 準拠の WSGI スレッドプール Web サーバー。通常、CherryPy 自体は 1 ページあたり 1 ~ 2 ミリ秒しかかかりません。
  • Apache、IIS、lighttpd、mod_python、FastCGI、SCGI、および mod_wsgi を含む、その他の WSGI 対応 Web サーバーまたはアダプターのサポート
  • 一度に複数の HTTP サーバー (複数のポートなど) を簡単に実行できます
  • 開発者とデプロイ担当者の両方にとって強力な構成システム
  • 柔軟なプラグイン システム
  • キャッシング、エンコーディング、セッション、承認、静的コンテンツなどの組み込みツール
  • ネイティブの mod_python アダプター
  • 完全なテスト スイート
  • 交換可能でカスタマイズ可能...すべて。
  • 組み込みのプロファイリング、カバレッジ、およびテストのサポート。
于 2008-10-17T19:33:25.227 に答える
7

設計の再検討を検討してください。ウェブサーバーでこれほど多くの状態を維持するのは、おそらく悪い考えです。マルチプロセスは、安定性を確保するためのはるかに優れた方法です。

別々のプロセス間で状態を共有する別の方法はありますか? サービスはどうですか?データベース?索引?

メモリ内に大量のデータ配列を保持し、単一のマルチスレッド プロセスに依存してすべてのリクエストを処理することが、アプリにとって最適な設計またはアーキテクチャであるとは考えにくいでしょう。

于 2008-10-17T19:35:04.240 に答える
6

Twistedはそのような Web サーバーとして機能します。それ自体はマルチスレッド化されていませんが、(まだリリースされていない) マルチスレッド化された WSGI コンテナーが現在のトランクに存在します。SVN リポジトリをチェックアウトしてから、次を実行できます。

twistd web --wsgi=your.wsgi.application
于 2008-10-18T03:32:42.917 に答える
3

作業しているサイトの種類と予想される負荷の種類を知らずに、決定的な答えを出すのは困難です。1 秒未満のパフォーマンスは、重要な要件である場合もあれば、そうでない場合もあります。最後のミリ秒を本当に保存する必要がある場合は、配列をメモリに保持する必要があります。ただし、他の人が示唆しているように、他の方法でうまくいかない可能性が高い. 配列内のデータの使用パターンは、選択の種類に影響を与える可能性があります。おそらく、配列からデータのセット全体に一度にアクセスする必要はないので、データを小さなチャンクに分割し、それらのチャンクを 1 つの大きな塊ではなくキャッシュに入れることができます。配列データを更新する必要がある頻度に応じて、memcached、ローカル データベース (berkley、sqlite、小さな mysql インストールなど) またはリモート データベース。かなり頻繁な更新にはmemcachedと言えます。1 時間ごとの頻度のローカル データベースと、毎日の頻度のリモート データベース。考慮すべきことの 1 つは、キャッシュ ミスの後に何が起こるかです。50 のクライアントが突然キャッシュ ミスを取得し、それらすべてが同時にそれらの高価なアレイの再生成を開始することを決定した場合、ボックスはすぐに 8086 に縮小されます。そのため、それをどのように処理するかを考慮する必要があります。キャッシュ ミスから回復する方法については、多くの記事で取り上げられています。これが役に立てば幸いです。50 のクライアントが突然キャッシュ ミスを取得し、それらすべてが同時にそれらの高価なアレイの再生成を開始することを決定した場合、ボックスはすぐに 8086 に縮小されます。そのため、それをどのように処理するかを考慮する必要があります。キャッシュ ミスから回復する方法については、多くの記事で取り上げられています。これが役に立てば幸いです。50 のクライアントが突然キャッシュ ミスを取得し、それらすべてが同時にそれらの高価なアレイの再生成を開始することを決定した場合、ボックスはすぐに 8086 に縮小されます。そのため、それをどのように処理するかを考慮する必要があります。キャッシュ ミスから回復する方法については、多くの記事で取り上げられています。これが役に立てば幸いです。

于 2008-10-17T20:34:06.773 に答える
2

web.pyは過去に私を幸せにしてくれました。それをチェックすることを検討してください。

しかし、アーキテクチャの再設計が適切であるように聞こえますが、より高価なソリューションです。

于 2008-10-18T17:12:17.050 に答える
2

マルチスレッドではありませんが、ツイストがニーズに役立つ場合があります。

于 2008-10-17T19:22:28.320 に答える
2

を使用した Python での実装に問題がある可能性がありますBaseHttpServer。「行き詰まる」理由はなく、 and を使用して単純なスレッド化されたサーバーを実装することは難しくBaseHttpServerありthreadingません。

また、単純なマルチスレッド サーバーの実装については、 http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServerHTTPServerをご覧ください。ThreadingMixIn

于 2008-10-17T19:27:36.050 に答える
2

代わりに、各プロセスからアクセスできる分散キャッシュを使用できます。memcachedがその例です。

于 2008-10-17T19:31:15.980 に答える
1

私は実際に最近同じ問題を抱えていました。つまり、BaseHTTPServerを使用して単純なサーバーを作成しましたが、マルチスレッドではないという事実が大きな欠点であることがわかりました。

私の解決策は、サーバーをPylons(http://pylonshq.com/)に移植することでした。移植はかなり簡単で、Pylonsを使用してGUIを作成するのが非常に簡単であるという利点があったため、基本的にデーモンプロセスの上にステータスページを表示することができました。

私はパイロンをこのように要約します:

  • これは、Webアプリのデプロイを非常に簡単にすることを目的としているという点でRubyonRailsに似ています。
  • デフォルトのテンプレート言語であるMakoは、非常に使いやすくなっています。
  • それは非常に便利なルーティングURLのシステムを使用しています
  • 私たちにとってパフォーマンスは問題ではないので、Pylonsがあなたのニーズに適切に機能することを保証することはできません
  • 私はこれを試していませんが、ApacheとLighthttpdで使用できます

また、Twistedを使用してアプリを実行し、満足しています。Twistedのパフォーマンスは良好ですが、Twistedのシングルスレッド/スレッドへの遅延プログラミングモデルはかなり複雑です。これには多くの利点がありますが、単純なアプリとしては私の選択ではありません。

幸運を。

于 2008-10-18T17:04:14.523 に答える
1

個人的にも職業的にも CherryPy を使用していますが、非常に満足しています。グローバルオブジェクトキャッシュを持っている、バックグラウンドで他のスレッドを実行しているなど、あなたが説明しているようなこともします。そして、Apacheとうまく統合されます。ローカルホストにバインドされたスタンドアロン サーバーとして CherryPy を実行し、Apache を使用mod_proxymod_rewriteて、Apache がリクエストを透過的に CherryPy に転送するようにします。

CherryPy の Web サイトはhttp://cherrypy.org/です。

于 2008-10-17T19:30:57.803 に答える
0

いつもの容疑者と違うところを指摘すると…

数年前、Zope 2.x を使用していたときに、 Medusaがプラットフォームに使用される Web サーバーであるという記事を読みました。彼らはそれが高負荷下でうまく動作することを宣伝しており、あなたが求めた機能を提供できます.

于 2008-10-17T20:31:57.823 に答える