1

フレームワークを使ってアプリケーションを開発していますbottlepy。標準ライブラリWSGIRefServer()を使用して開発サーバーを実行しています。これはシングルスレッドサーバーです。

さて、本番環境に入るときは、マルチスレッドの本番サーバーに移行したいと思います。選択肢はたくさんあります。CherryPyを選んだとしましょう。

今、私のコードでは、単一のwsgiアプリケーションを初期化しています。それ以外にも、他のものを初期化しています...

  • Memcached接続
  • マコテンプレート
  • MongoDB接続

標準ライブラリwsgirefはシングルスレッドサーバーであり、単一のwsgiアプリ(wsgi呼び出し可能)のみを作成しているため、すべてが正常に機能します。

私が知りたいのは、マルチスレッドサーバーに移動すると、wsgiアプリ、初期化コード、別のサーバーへの接続などがどのように動作するかということです。

  • マルチスレッドサーバーは、スレッドごとにwsgiアプリの個別のインスタンスを作成しますか?また、新しいリクエストごとに新しいスレッドが生成されますか(つまり、リクエストごとに新しいwsgiアプリを意味します)?

  • memcached、mongoDBなどへの接続は、スレッド間で共有されますか?他に何がスレッド間で共有されますか

  • スレッドサーバーの要求/応答サイクルについて説明してください

4

1 に答える 1

1

一般に、アプリケーションはwsgi準拠のフレームワークを使用しているため、マルチスレッド/シングルスレッドのサーバー側を恐れる必要はありません。これは透過的に動作することを目的としており、wsgiに準拠している限り、サーバーの種類に関係なく同じように反応する必要があります。

以前のすべてのコードブロックbottle.run()は1回だけ実行されます。そのため、すべての接続(データベース、memcached)は一度だけインスタンス化され、共有されます。

Bottlepyを呼び出すとbottle.run()、wsgiサーバーが起動します。そのサーバーへのすべてのリクエストは、bottlepyフレームワーク内で呼び出し可能なwsgiを起動します。何か奇妙なことをしない限り、それがシングルスレッド環境であるかマルチスレッド環境であるかはあまり興味がありません。

奇妙なことに、たとえばグローバル変数を介して何かを同期することを意味します。request(ここでの例外は、bottlepyが適切なコンテキストで適切な要求を含むことを保証するグローバルオブジェクトです)。

そして、リストの最初の質問に答えて:リクエストは新しく生成されたスレッドまたはスレッドのプールからのスレッドで計算される可能性があります(CherryPyはスレッドプールされます)

于 2012-06-08T14:28:15.847 に答える