2013-08-05 2 views
1

Я пытаюсь использовать AsyncHTTPClient в Торнадо, чтобы сделать несколько уточнений к «устройству», доступному по HTTP:цикла с использованием AsyncHTTPClient (Tornado, Python)

def ext_call(self, params): 
    device = AsyncHTTPClient() 
    request = HTTPRequest(...) 
    return partial(device.fetch, request) 

@coroutine 
def _do_call(self, someid): 
    acall = self.ext_call(params) 
    waitkey = str(someid) 
    acall(callback = (yield Callback(waitkey))) 
    response = yield Wait(waitkey) 
    raise Return(response) 

def get_device_data(self, lst): 
    for someid in lst: 
     r = self._do_call(someid) 
     print 'response', r 

Но вместо ответов HTTP, как AsyncHTTPClient должен вернуться после того, как .fetch, я получаю это:

response <tornado.concurrent.TracebackFuture object at 0x951840c> 

Почему это не работает, как примеры в http://www.tornadoweb.org/en/stable/gen.html?

ответ

0

Получил этот вопрос. Похоже, что @coroutine необходимо применять вплоть до метода get/post вашего класса, наследующего от RequestHandler, в противном случае магия @ coroutine/yield не работает.

По-видимому, это случай с новинкой Tornado в сочетании с плохим дизайном с моей стороны: по словам коллеги, не следует делать «обратные спагетти» вложенных @coroutine и yield() s, а скорее перемещать весь синхронный код обработчика запроса и вызова до или после асинхронного кода, а также иерархии вызовов @coroutine, а не глубины.

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