2017-01-20 9 views
0

Я бегу, витая с pymongo. Я знаю, что при использовании запроса pymongo .find() вам нужно отложить его, когда вы перебираете курсор.Вам нужно отложить .count() в pymongo и перекрутить?

То же самое относится к .count()? Должен ли я отложить его или он не останавливается?

РЕДАКТИРОВАТЬ: если это нужно отложить, каков был бы правильный способ сделать это?

Нужно ли мне создать курсор, а затем позвонить на это рассчитывать:

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 просто создает курсор и не делает ввода/вывода, тогда как вызывает count. Таким образом, вы можете позвонить find в основной поток или рабочий поток, в зависимости от того, что удобно.

При вызове deferToThread, передать функции, не называют его:

value_to_get = deferToThread(get_filtered_count) 

Или просто:

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

Спасибо. В этом случае мне нужно сначала создать курсор в deferToThread, а затем вызвать счетчик на нем? Смотрите, пожалуйста, мое редактирование. –

+0

Как правило, нет никакого вреда в создании курсора в потоке. Курсор также может быть создан в основном потоке и передан как параметр в '' deferToThread'' –

+0

Я отредактировал свой ответ. –