1

我正在尝试在 Tornado 中使用 AsyncHTTPClient 对通过 http 可用的“设备”进行多次标注:

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中的示例那样工作 ?

4

1 回答 1

0

解决了这个问题。看来@coroutine 必须从继承自RequestHandler 的类的get/post 方法一直向下应用,否则@coroutine/yield 魔法不起作用。

显然,这是 Tornado 新手与我的糟糕设计相结合的一个案例:根据一位同事的说法,不应该对嵌套的 @coroutine 和 yield() 进行“回调意大利面条”,而是将所有同步代码移出请求处理程序和在异步代码之前或之后调用它并使@coroutine调用层次结构平坦而不是深。

于 2013-08-06T09:33:29.300 回答