2

我正在做的项目都是用 Tornado 编写的,但是我包含了一些 Twisted 来处理异步 XML-RPC。我想知道您是否可以将 Tornado 的 gen.engine 和 yield gen.Task 与 Twisted 的代码一起使用。这可能吗?如果是这样,语法会是什么样子?提前致谢。

4

3 回答 3

4

当然——但它inlineCallbacks在 Twisted 中被调用:

from twisted.internet.defer import inlineCallbacks

@inlineCallbacks
def foo():
    x = yield bar()
    print x
于 2013-10-16T11:30:18.773 回答
3

您可以使用gen.Task任何带有callback关键字参数的东西。然而,Twisted 风格的代码通常返回 aDeferred而不是将回调作为输入。您需要将内容包含Deferredtornado.gen可以理解的内容中(可能是 a 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())
于 2013-10-16T13:07:39.417 回答
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 抱怨它不是异常类型。

于 2015-07-28T07:11:04.927 回答