2013-07-31 2 views
3

просто борются за это. Если у меня есть обработчик асинхронного запроса, который во время его выполнения вызывает другие функции, которые что-то делают (например, запросы async db), а затем они сами называют «завершение», я должен отмечать их как async? потому что, если приложение структурировано, как в примере, я получаю ошибки в отношении нескольких вызовов для «завершения». Наверное, я что-то пропустил.Функция вызова от Tornado async

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) 

Должны ли все функции маркироваться асинхронным способом? спасибо

ответ

0

Вызов завершения завершает HTTP-запрос см. docs. Другие функции не должны называть «финиш»

Я думаю, вы хотите сделать что-то подобное. Обратите внимание, что есть дополнительные пары «обратный вызов», который добавляется в асинхронную функцию:

@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 docs для получения дополнительной информации

Смежные вопросы