繁体   English   中英

同时使用龙卷风和扭曲

[英]Using Tornado and Twisted at the same time

我处于一种奇怪的情况下,必须在完全由Tornado构建的系统中使用Twisted。 他们可以共享同一个IOLoop,所以我知道他们可以一起工作。 我的问题是我可以在同一个函数中安全地使用他们的共同例程装饰器吗? 例如:

import tornado.platform.twisted
tornado.platform.twisted.install()

...

@gen.engine
@defer.inlineCallbacks
def get(self):

    ...

    a = yield gen.Task(getA) # tornado
    b = yield proxy.callRemote(getB) # twisted

    ...

    defer.returnValue(a + b) # twisted

他们在同一个IOLoop上工作,所以我认为这应该没问题。 会有任何不可预见的后果吗? 提前致谢。

看起来你想要的是Cyclone ,一个用于Python的Web服务器框架,它将Tornado API实现为Twisted协议。

不,这行不通。 在你的情况下, inlineCallbacks直接包裹在你的生成器周围, gen.engine被包裹在外面。 问题在于inlineCallbacksgen.Task ,它将立即产生(无法将其传递给gen.engine )。

详细说明:如果你在inlineCallbacks -wrapped生成器中产生obj ,可能会发生两件事:

  1. obj是一个Deferred在这种情况下,控制权返回到反应堆,直到Deferred火灾发生。
  2. obj是其他东西,在这种情况下,它会立即发送回生成器。

在您的情况下,结果将是:

a = yield gen.Task(getA) # continues right through
# a is of type gen.Task here
b = yield proxy.callRemote(getB) # waits for result of proxy.callRemote

请参阅此处了解如何实现inlineCallbacks

这样做的正确方法是什么? 尝试使用inlineCallbacksgen.engine (但不能同时使用)。 将外来gen.Task (或Deferred )包装为“本机”形式。 我对龙卷风不熟悉,但也许这个问题会有所帮助

另外,写自己喜欢的装饰inlineCallbacks ,处理gen.Task为好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM