3

Tornado WebサーバーをMongodbと組み合わせて実行しています(pymongoドライバーを使用)。パフォーマンスを最大化するために、アーキテクチャ上の決定を下そうとしています。

Tornadoとpymongoを一緒に使用した場合の、結果として得られるアプリケーションのブロック/非ブロックおよび非同期の側面に関して、いくつかのサブ質問があります。

質問1:接続プール

オブジェクトがpymongo.mongo_client.MongoClient接続のプールを自動的に実装しているようです。異なるスレッドから同時にmongodbにアクセスできるようにするための「接続プール」の意図された目的はありますか?単一のスレッドから単一のMongoClientインスタンスを使用して実行した場合、常に開いている接続は1つだけなので、実際には「プール」はありません。

質問2:マルチスレッドのMongo呼び出し

次のFAQ:

http://api.mongodb.org/python/current/faq.html#does-pymongo-support-asynchronous-frameworks-like-gevent-tornado-or-twisted

状態:

現在、PyMongoをTornadoまたはTwistedと組み合わせて使用​​する優れた方法はありません。PyMongoは組み込みの接続プールを提供するため、MongoClientを共有するマルチスレッドコードを記述するだけで、これらのフレームワークの利点の一部を実現できます。

だから私はMongoClient各スレッドに単一の参照を渡すだけだと思いますか?それともそれ以上のものがありますか?各スレッドが結果を生成するときにコールバックをトリガーする最良の方法は何ですか?キュー(python)を監視して各結果を処理し、トルネードで開いている左側のオブジェクトQueue.Queueを呼び出すのが仕事であるスレッドを1つ実行する必要がありますか?(もちろん、デコレータを使用する必要があります)finish()RequestHandlertornado.web.asynchronous

質問3:複数のインスタンス

最後に、私が作品を作成しているだけである可能性はありますか?Tornadoのシングルスレッドインスタンスを実行してショートカットし、コアごとに3〜4個のインスタンスを開始する必要がありますか?(上記のFAQリファレンスはこれを示唆しているようです)

結局のところ、PythonのGILは、とにかく効果的に異なるプロセスをもたらしませんか?または、トルネードの「ノンブロッキング」の側面による追加のパフォーマンスの考慮事項(プラスまたはマイナス)はありますか?(ここで指摘されているように、これはI / Oの観点から非ブロッキングであることを私は知っています: トルネードは本当に非ブロッキングですか?

(追記: https ://github.com/bitly/asyncmongoでasyncmongoを認識して いますが、pymongoを直接使用し、この追加の依存関係を導入したくないです。)

4

3 に答える 3

2

私が理解しているように、Webサーバーには2つの概念があります。

  1. スレッドベース(apache)
  2. イベントドリブン(トルネード)

また、Pythonを使用したGILがあり、GILはスレッドには適していません。また、イベントドリブンは1つのスレッドのみを使用するモデルなので、イベントドリブンを使用してください。

Pymongoは竜巻をブロックするので、ここに提案があります:

  1. Pymongoの使用:Pymongoを使用し、インデックスを作成することでデータベース呼び出しを高速化しますが、注意してください。インデックスは、たとえば次のように多くの値をスキャンする操作では機能しません。gte
  2. AsyncMongoを使用すると、更新されたように見えますが、まだすべてのmongodb機能ではありません。
  3. Mongotorを使用すると、これはAsynchmongoの更新のようなものであり、ODM(Object Document Mapper)があり、MongoDBから必要なもの(集約、レプリカセットなど)がすべてあり、本当に見逃している機能はGridFSだけです。
  4. Motorを使用すると、これはTornadoで使用する完全なソリューションであり、GridFSをサポートし、Tornadoの公式のMongodb非同期ドライバーであり、Greenletを使用したハックを使用するため、唯一の欠点はPyPyで使用しないことです。

そして今、トルネード以外の解決策を決定した場合、Geventを使用する場合は、Pymongoを使用できます

PyMongoが完全にサポートする唯一の非同期フレームワークはGeventです。

注意:話題から外れて申し訳ありませんが、文:

現在、トルネードと組み合わせてPyMongoを使用する優れた方法はありません。

ドキュメントから削除する必要があります。MongotorとMotorは完璧に機能します(特にMotor)。

于 2013-03-12T00:17:57.553 に答える
1

質問は古いですが、与えられた答えは、ユーザーが尋ねたすべての質問に完全に対応しているわけではないと感じました。

単一のスレッドから単一のMongoClientインスタンスを使用して実行した場合、常に開いている接続は1つだけなので、実際には「プール」はありません。

スクリプトがスレッドを使用しない場合、これは正しいです。ただし、スクリプトがマルチスレッドの場合、特定の時間に複数の接続が開かれます

最後に、私が作品を作成しているだけである可能性はありますか?Tornadoのシングルスレッドインスタンスを実行してショートカットし、コアごとに3〜4個のインスタンスを開始する必要がありますか?

いいえ、違います!複数のスレッドを作成することは、複数のフォークよりもリソースを消費しません。

結局のところ、PythonのGILは、とにかく効果的に異なるプロセスをもたらしませんか?

GILは、複数のスレッドが同時にインタープリターにアクセスするのを防ぐだけです。複数のスレッドが同時にI/Oを実行することを妨げません。実際、それがまさに非同期性を備えたモーターが非同期性を実現する方法です。

スレッドプールエグゼキュータを使用して、クエリごとに新しいスレッドを生成し、スレッドが完了すると結果を返します。

于 2017-07-24T04:38:21.580 に答える
0

モーターも知っていますか?:http : //emptysquare.net/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado/pymongoの共著者であるJesseDavisによって作成されました

于 2013-03-12T00:13:27.250 に答える