3

只是在这方面苦苦挣扎。如果我有一个异步请求处理程序,它在执行期间调用其他执行某些操作的函数(例如异步数据库查询),然后它们自己调用“完成”,我是否必须将它们标记为异步?因为如果应用程序的结构类似于示例,我会收到有关多次调用“完成”的错误。我想我错过了什么。

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 请求,请参阅文档。其他函数不应调用“完成”

我想你想做这样的事情。请注意,有一个额外的参数“回调”被添加到异步函数中:

@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 回答