0

想对一个简单的查询进行排序,但不确定它如何与“gen.task”一起使用,因为它需要一个方法作为 arg1,参数作为 arg2。

这很好用:

response, error = yield gen.Task(db.client().collection.find, {"user_id":user_id})
if response:
    #blablabla

但是我该如何给它排序()?

更新:这现在会引发“回调必须是可调用的”错误。现在,这似乎是 Tornado 的其他问题。

def findsort(self, find, callback):
    return callback(db.client().collection.find(find).sort({"myfield":1}))

@gen.engine
def anotherfunction(self):
    response, error = yield gen.Task(self.findsort, {"user_id":user_id})
4

4 回答 4

5

使用asyncmongo,它与gen.

杂耍之后你会得到这样的东西:

DB = asyncmongo.Client()

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @gen.engine
    def get(self):
        result, error = yield gen.Task(DB.collection.find, {}, limit=50, sort=[('myfield', 1)])

关于“回调必须是可调用的”.. 使用gen- 始终在函数中描述 +1 参数,由gen.Task.

def findsort(self, find, params, callback): #here we recieve self + 3 args, if we remove params - callback will contain {"user_id":user_id} 
    return callback(db.client().collection.find(find).sort({"myfield":1}))

@gen.engine
def anotherfunction(self):
    response, error = yield gen.Task(self.findsort, {"user_id":user_id}) #we see 2 args, but it passes 3 args to findsort
于 2012-08-01T15:29:25.740 回答
1

我不熟悉 gen.Task 但也许你可以尝试:

@gen.engine
def anotherfunction(self):

    def findsort(find):
         return db.client().collection.find(find).sort({"myfield":1})

    response, error = yield gen.Task(findsort, {"user_id":user_id})
于 2012-08-01T12:52:33.877 回答
1

看起来您正在尝试对 mongo db 进行异步调用。默认情况下 pymongo 是阻塞的,但是有一个名为 motor 的单独分支,它可以进行异步查询。

有关更多详细信息,请参阅http://emptysquare.net/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado/

它也支持 tornado.gen 生成器模式。

于 2012-08-01T13:25:47.103 回答
0

您应该使用asyncmongo,这是 pymongo 的异步实现。 gen.Task要求函数有callback参数。

于 2012-08-01T15:26:07.497 回答