2013-08-22 3 views
2

У меня есть код сервера с помощью Tornado:Tornado вызов функции обратного вызова, не дожидаясь результата

class mHandle(tornado.web.RequestHandler): 

    @gen.coroutine 
    def process(self, data): 
     yield gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 3) 


    @tornado.web.asynchronous 
    @gen.coroutine 
    def get(self): 
     _data = self.get_argument('data', default='') 
     yield gen.Task(self.process, _data) 
     self.write("OK") 

И теперь я с помощью браузера ввести локальный, он будет ждать 3s, а затем распечатать результат «OK». Меня не волнует результат, как код для браузера печатать «ОК» сразу, не дожидаясь 3s?

Спасибо!

ответ

2

(поднятием памяти здесь)

self.process возвращает будущее, так что вы могли бы сделать что-то простое, как:

@tornado.web.asynchronous 
@gen.coroutine 
def get(self): 
    _data = self.get_argument('data', default='') 

    ioloop.add_future(self.process(_data), self.process_complete) 
    self.write("OK") 

def process_complete(self, future): 
    """Handle the error/success from the future""" 

Вы, вероятно, следует сделать self.finish("OK") так, что закрывает асинхр.

+0

Спасибо, я использовал, и похоже, хорошо работает. Я узнаю больше об этой проблеме. Благодаря! – Dwind