2011-08-08 23 views
0

私はpelongoを使って、多くの非同期タスクを実行するためにCeleryも使用するアプリケーションでmongodbにアクセスしています。私はpymongoの接続プールが非同期ワーカー(ドキュメントに基づいて)をサポートしていないことを知っています。Pymongo、Celeryによる接続プーリングと非同期タスク

コレクションにアクセスするには、アプリケーションに合った特定のロジックをラップするCollectionクラスが必要です。私はこのラッパーで継承したコードを理解しようとしています。

  • 現在、各コレクションは独自のConnectionインスタンスを作成しています。私が読んでいることに基づいて、これは間違っています。実際には、(settings.pyなどで)1つのConnectionインスタンスがあり、それをCollectionインスタンスにインポートする必要があります。そのビットは明らかです。最大限の接続が推奨される限り、ガイドラインはありますか?現在のコードでは、プーリング機能を実際に使用していないため、たくさんの接続/ソケットが作成されています。

  • しかし、いくつかのコードは非同期セロリのタスクと同時に実行されるものから呼び出されるため、どのようにこれを処理するかはわかりません。私の考えは、タスク用の新しいConnectionインスタンスをインスタンス化し、同期インスタンス用に単一のものを使用することです(各アクティビティが終了した後のもちろん、ending_request)。これは正しい方向ですか?

ありがとう! pymongoのドキュメントから

ハレル

答えて

0

:「PyMongoはスレッドセーフとでも内蔵の提供マルチスレッド・アプリケーションのための接続プールです。」

状況に「非同期」という単語は、アプリケーションにどのように「矛盾した」要件があるかを示すことができます。

「x + = 1」のようなステートメントは、アプリ内で一貫しないことがあります。これを買う余裕があれば問題ありません。 「クリティカル」操作がある場合は、同期のために何らかのロックを実装する必要があります。

最大接続数については、正確な数値はわからないので、テストして続行してください。

スピードとメモリの効率が必要な場合は、exampleもご覧ください。私が作ったいくつかのベンチマークから、Redisのpythonドライバは、読み書きのためにpymongoより少なくとも2倍高速です。