3

これに苦労するだけです。実行中に何かを実行する他の関数 (非同期 db クエリなど) を呼び出す非同期要求ハンドラーがあり、それらが独自に "finish" を呼び出す場合、それらを非同期としてマークする必要がありますか? アプリケーションが例のように構成されている場合、「終了」への複数回の呼び出しに関するエラーが発生するためです。私は何かが恋しいと思います。

class MainHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    @gen.engine
    def post(self):
        #do some stuff even with mongo motor
        self.handleRequest(bla)

    @gen.engine
    def handleRequest(self,bla):
        #do things,use motor call other functions
        self.finish(result)

すべての関数を非同期でマークする必要がありますか? ありがとう

4

1 に答える 1

0

finish を呼び出すと、HTTP リクエストが終了します。 docsを参照してください。他の関数は 'finish' を呼び出さないでください

このようなことをしたいと思います。非同期関数に追加される追加のパラメーター「コールバック」があることに注意してください。

@tornado.web.asynchronous
@gen.engine
def post(self):
    query =''
    response = yield tornado.gen.Task(
        self.handleRequest,
        query=query
    )
    result = response[0][0]
    errors = response[1]['error']
    # Do stuff with result

def handleRequest(self, callback, query):
     self.motor['my_collection'].find(query, callback=callback)

詳細については、 tornado.gen のドキュメントを参照してください。

于 2013-07-31T13:59:46.103 に答える