2017-01-20 2 views
0

私はpymongoでねじれて走っています。私はpymongo .find()クエリを使用するとき、カーソルを反復処理するときにそれを延期する必要があることを知っています。pymongoとtwistedで.count()を延期する必要がありますか?

同じことが.count()に適用されますか?私はそれを延期する必要がありますか、それとも停止していませんか?

EDIT:延期する必要がある場合、それを行う正しい方法は何ですか?

value_deferred = deferToThread(
       mongo_collection.find, 
       mongo_query, 
      ) 
value_deferred.count() 

またはすぐにカウントを取得するにはどのような方法があります:

は、私が最初にカーソルを作成する必要がありますし、それを頼りに呼んでいますか?私はこれを行う場合は

def get_filtered_count(): 
    return db_collection.find(mongo_query).count() 

value_to_get = deferToThread(get_filtered_count()) 

は、私はこのエラーを取得:exceptions.TypeErrorを:歩留まりの使用は、ここで正当化される:「int型のオブジェクトは、

はEDIT 2呼び出すことはできませんか?私はそうでなければそれを呼び出すときにエラーが発生します。あなたは延期しなければならない何

@inlineCallbacks 
def render_deferred(self, request): 
    cursor = self.mongo.find() 
    get_counter = yield deferToThread(cursor.count) 
    page_size = 3 
    number_of_pages = get_counter/page_size 
    return final_value 

def render_GET(self, request): 
    ## some code 
    deferred = self.render_deferred(request) 

    deferred.addCallback(_send, request) 
    deferred.addErrback(handle_failure, request) 

答えて

1

countへの実際の呼び出しです。 findメソッドはカーソルを作成し、I/Oを行わず、countを呼び出します。したがって、便利なことに応じて、メインスレッドまたはワーカースレッドでfindに電話することができます。

あなたは、deferToThreadを呼び出す関数を渡す

、それを呼び出すことはありません。ただ

value_to_get = deferToThread(get_filtered_count) 

または:

cursor = collection.find(query) 
deferred = deferToThread(cursor.count) 
+0

感謝。その場合、最初にdeferToThreadにカーソルを作成してからカウントを呼び出す必要がありますか?私の編集を参照してください。 –

+0

スレッド内にカーソルを作成する際に通常は問題ありません。カーソルはメインスレッドで作成し、 '' deferToThread''のパラメータとして渡すこともできます –

+0

私は自分の答えを編集しました。 –

関連する問題