16

pymongoはスレッドセーフであり、組み込みの接続プールを持っていることを知っています。

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

私の理解ではpymongo、接続プールを管理しているため、要求の最後に接続インスタンスが再利用され、後続の要求で使用できるようになるため、要求ごとに新しい接続を作成するのは間違ったアプローチではありません。

ここで正しいですか、それとも単一のインスタンスを作成して複数のリクエストで使用する必要がありますか?

4

1 に答える 1

9

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

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

geventを使用する場合、グリーンレットごとにソケットを持つことができます。これは、リクエストごとに真のスレッドを持つ必要がないことを意味します。リクエストは非同期でありながら、独自のソケットを取得できます。

一言で言えば:

  • Webアプリのリクエストがスレッド化されている場合は、新しい接続にアクセスする方法は関係ありません。結果は同じになります(スレッドごとのソケット)
  • Webアプリがgeventを介して非同期である場合、新しい接続にアクセスする方法は関係ありません。結果は同じになります。(グリーンレットあたりのソケット)
  • Webアプリが非同期であるが、geventを介していない場合は、最適なワークフローに関する注意事項を考慮する必要があります。
于 2012-06-13T06:01:35.500 に答える