2013-10-16 41 views

回答

4

當然 - 但它被稱爲inlineCallbacks在扭曲:

from twisted.internet.defer import inlineCallbacks 

@inlineCallbacks 
def foo(): 
    x = yield bar() 
    print x 
3

您可以使用gen.Task有任何需要callback關鍵字參數。但是,扭曲式代碼通常會返回Deferred而不是將回調作爲輸入。你需要將Deferred換成tornado.gen可以理解的東西(可能是Future)。像這樣(未經測試):

def wrap_deferred(deferred): 
    # Could also use concurrent.futures.Future from the standard library, 
    # but Tornado's version gives better tracebacks on python 2. 
    future = tornado.concurrent.TracebackFuture() 
    deferred.addCallbacks(future.set_result, future.set_exception) 
    return future 

@gen.coroutine 
def my_coroutine(self): 
    # Use wrap_deferred instead of gen.Task 
    x = yield wrap_deferred(some_twisted_function()) 
0

我修改了Ben的示例代碼,以便正確設置異常。

def wrap_deferred(deferred): 
    future = tornado.concurrent.TracebackFuture() 
    deferred.addCallback(future.set_result) 
    deferred.addErrback(lambda err: future.set_exception(err.value)) 
    return future 

扭曲渦卷異常作爲failure.Failure。 future.set_exception抱怨它不是一個異常類型。