是否有可能使用龙卷风的gen.engine和gen.Task与扭曲?

时间:2013-10-16 06:36:39

标签: python asynchronous client-server twisted tornado

我正在开发的项目都是用Tornado编写的,但是我已经包含了一些Twisted来处理异步XML-RPC。我想知道你是否可以使用Tornado的gen.engine并使用Twisted的代码生成gen.Task。这可能吗?如果是这样,语法将如何?提前谢谢。

3 个答案:

答案 0 :(得分:4)

当然 - 但它在Twisted中被称为inlineCallbacks

from twisted.internet.defer import inlineCallbacks

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

答案 1 :(得分:3)

您可以将gen.Task与任何带有callback关键字参数的内容一起使用。但是,Twisted风格的代码通常返回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())

答案 2 :(得分: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

扭曲换行异常为失败。失败。 future.set_exception抱怨它不是异常类型。