我试图在“旋风”中使用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中的示例那样工作呢?
发布于 2013-08-06 09:33:29
解决了这个问题。看来@coroutine必须从继承RequestHandler的类get/post方法中一直应用,否则@coroutine/产生魔力就无效。
显然,这是“旋风”的新鲜感与我这方面糟糕的设计相结合的情况:据一位同事说,不应该做嵌套@coroutine和but ()s的“回调意大利面”,而应该将所有同步代码移出请求处理程序,并在异步代码之前或之后调用它,并让@coroutine调用层次结构平缓而不是深。
https://stackoverflow.com/questions/18066908
复制相似问题