2017-01-20 27 views
0

我正在運行與pymongo扭曲。我知道當使用pymongo .find()查詢時,您需要在迭代遊標時將其延遲。你需要在pymongo中推遲.count()並扭曲嗎?

這同樣適用於.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: '詮釋' 對象不是可調用

編輯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

你必須推遲的是實際撥打countfind方法只是創建一個遊標,不做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

我編輯了我的答案。 –