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