2017-01-20 1 views
0

Je suis en cours d'exécution avec pymongo tordu. Je sais que lorsque vous utilisez la requête pymongo .find(), vous devez la différer lorsque vous faites une itération sur le curseur.Avez-vous besoin de reporter .count() dans pymongo et tordu?

-il de même à .Count()? Ai-je besoin de reporter ou de ne pas arrêter?

EDIT: si elle doit être différée, quelle serait la bonne façon de le faire?

Ai-je besoin de créer un curseur d'abord, puis appeler compter sur elle:

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

ou est-il possible d'obtenir le nombre tout de suite?

Si je fais ceci:

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

value_to_get = deferToThread(get_filtered_count()) 

Je reçois cette erreur: exceptions.TypeError: objet 'int' est pas appelable

EDIT 2: L'utilisation du rendement ici justifié? J'ai des erreurs en l'appelant autrement.

@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) 

Répondre

1

Ce que vous devez reporter est l'appel réel à count. La méthode find crée juste un curseur et ne fait pas d'E/S, tandis que l'appel count fait. Vous pouvez donc appeler le find sur le thread principal ou le thread de travail, en fonction de ce qui est pratique.

Lorsque vous appelez deferToThread, passez la fonction, ne l'appelez pas:

value_to_get = deferToThread(get_filtered_count) 

Ou tout simplement:

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

Merci. Dans ce cas, dois-je d'abord créer un curseur dans deferToThread, puis appeler un compte? Voir ma modification, s'il vous plaît. –

+0

Il n'y a généralement aucun mal à créer le curseur dans le fil. Le curseur peut également être créé dans le thread principal et passé en tant que paramètre dans '' deferToThread'' –

+0

J'ai modifié ma réponse. –