0

単純なクエリをソートしたいのですが、arg1 としてメソッドを、arg2 として param を取るため、これが "gen.task" でどのように機能するかわかりません。

これはうまくいきます:

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

しかし、どうすれば sort() を与えることができますか?

UPDATE : これにより、「callback must be callable」エラーがスローされるようになりました。これは現在、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)])

そして、'callback must be callable' について.. 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

mongo db への 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 に答える
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 に答える
0

pymongo の非同期実装である asyncmongoを使用する必要があります。gen.Task関数にcallbackパラメーターが必要です。

于 2012-08-01T15:26:07.497 に答える