2012-06-10 15 views
15

私はpymongoがスレッドセーフであり、inbuilt接続プールを持っていることを知っています。pymongo接続プールとクライアントリクエスト

私が取り組んでいるWebアプリケーションでは、リクエストごとに新しい接続インスタンスを作成しています。

pymongoは接続プールを管理しているため、リクエストの最後に接続インスタンスが再要求され、後続のリクエストで利用できるように、各リクエストで新しい接続を作成するのは間違ったアプローチではない。

ここで正しいのですか、複数のリクエストで使用するインスタンスを1つだけ作成する必要がありますか?

答えて

8

「間違ったアプローチ」は、アプリケーションのアーキテクチャによって異なります。 pymongoがスレッドセーフで自動接続プールであるため、単一の共有接続または複数の接続を実際に使用することは「作業する」ことになります。しかし、その結果はあなたがその行動を期待するものによって決まるでしょう。ドキュメンテーションは両方のケースについてコメントしています。

アプリケーションがスレッド化されている場合、ドキュメントから接続にアクセスする各スレッドは独自のソケットを取得します。したがって、単一の共有接続を作成する場合でも、新しい接続をリクエストする場合でも、リクエストがスレッド化されているかどうかが判断されます。

geventを使用している場合は、緑色の1つあたりソケットを持つことができます。つまり、リクエストごとに真のスレッドを持つ必要はありません。リクエストは非同期で、依然として独自のソケットを取得できます。一言で言えば

  • あなたのWebアプリケーションの要求がスレッド化されている場合、それはあなたが新しい接続にアクセスする方法は重要ではありません。結果は同じになります(スレッドごとのソケット)
  • webappがgevent経由で非同期である場合、新しい接続をどのようにアクセスするかは関係ありません。結果は同じになります。
  • webappが非同期でgeent経由ではない場合は、best suggested workflowの注釈を考慮する必要があります。