2013-08-05 123 views
1

我試圖使用AsyncHTTPClient在龍捲風做多標註爲「裝置」可以通過http:循環使用AsyncHTTPClient(龍捲風,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

得到了這一個解決。看起來@curoutine必須從繼承自RequestHandler的類的get/post方法一直被應用,否則@ coroutine/yield magic不起作用。

顯然這是一個龍捲風新手加上我的糟糕設計的情況:根據同事不應該做嵌套@coroutine和yield()s的「回調意大利麪條」,而是將所有的同步代碼移出的請求處理程序,並在異步代碼之前或之後調用它,並使@coroutine調用層次平坦而非深度。