我正在尝试在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
但是,由于AsyncHTTPClient应该在.fetch之后返回,而不是HTTP响应,我得到了这个:
response <tornado.concurrent.TracebackFuture object at 0x951840c>
为什么这不像http://www.tornadoweb.org/en/stable/gen.html中的示例那样工作?
答案 0 :(得分:0)
解决了这个问题。看来@coroutine必须从继承自RequestHandler的类的get / post方法一直向下应用,否则@ coroutine / yield magic不起作用。
显然这是一个龙卷风新闻加上我的设计糟糕的情况:根据一位同事不应该做嵌套@coroutine和yield()s的“回调意大利面”,而是将所有同步代码移出请求处理程序并在异步代码之前或之后调用它,并让@coroutine调用层次结构而不是深层次。