你需要在pymongo推迟.count()并扭曲吗?

时间:2017-01-20 11:32:37

标签: python twisted pymongo

我正在与pymongo扭曲。我知道当你使用pymongo .find()查询时,你需要在迭代游标时推迟它。

同样适用于.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'对象不可调用

编辑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 个答案:

答案 0 :(得分:1)

您必须推迟的是对count的实际调用。 find方法只创建一个游标而不执行I / O,而调用count则执行。因此,您可以在主线程或工作线程上调用find,具体取决于方便的内容。

当你调用deferToThread时,传递函数,不要调用它:

value_to_get = deferToThread(get_filtered_count)

或者只是:

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