Tornado WebサーバーをMongodbと組み合わせて実行しています(pymongoドライバーを使用)。パフォーマンスを最大化するために、アーキテクチャ上の決定を下そうとしています。
Tornadoとpymongoを一緒に使用した場合の、結果として得られるアプリケーションのブロック/非ブロックおよび非同期の側面に関して、いくつかのサブ質問があります。
質問1:接続プール
オブジェクトがpymongo.mongo_client.MongoClient
接続のプールを自動的に実装しているようです。異なるスレッドから同時にmongodbにアクセスできるようにするための「接続プール」の意図された目的はありますか?単一のスレッドから単一のMongoClientインスタンスを使用して実行した場合、常に開いている接続は1つだけなので、実際には「プール」はありません。
質問2:マルチスレッドのMongo呼び出し
次のFAQ:
状態:
現在、PyMongoをTornadoまたはTwistedと組み合わせて使用する優れた方法はありません。PyMongoは組み込みの接続プールを提供するため、MongoClientを共有するマルチスレッドコードを記述するだけで、これらのフレームワークの利点の一部を実現できます。
だから私はMongoClient
各スレッドに単一の参照を渡すだけだと思いますか?それともそれ以上のものがありますか?各スレッドが結果を生成するときにコールバックをトリガーする最良の方法は何ですか?キュー(python)を監視して各結果を処理し、トルネードで開いている左側のオブジェクトQueue.Queue
を呼び出すのが仕事であるスレッドを1つ実行する必要がありますか?(もちろん、デコレータを使用する必要があります)finish()
RequestHandler
tornado.web.asynchronous
質問3:複数のインスタンス
最後に、私が作品を作成しているだけである可能性はありますか?Tornadoのシングルスレッドインスタンスを実行してショートカットし、コアごとに3〜4個のインスタンスを開始する必要がありますか?(上記のFAQリファレンスはこれを示唆しているようです)
結局のところ、PythonのGILは、とにかく効果的に異なるプロセスをもたらしませんか?または、トルネードの「ノンブロッキング」の側面による追加のパフォーマンスの考慮事項(プラスまたはマイナス)はありますか?(ここで指摘されているように、これはI / Oの観点から非ブロッキングであることを私は知っています: トルネードは本当に非ブロッキングですか?)
(追記: https ://github.com/bitly/asyncmongoでasyncmongoを認識して いますが、pymongoを直接使用し、この追加の依存関係を導入したくないです。)