Python 同时使用龙卷风和扭曲

Python 同时使用龙卷风和扭曲,python,asynchronous,twisted,tornado,Python,Asynchronous,Twisted,Tornado,我处于一个奇怪的境地,我必须在一个完全由龙卷风构建的系统中使用Twisted。 他们可以共享同一个IOLoop,所以我知道他们可以一起工作。我的问题是,我能在同一个函数中安全地使用它们的共同例程装饰器吗?例如: import tornado.platform.twisted tornado.platform.twisted.install() ... @gen.engine @defer.inlineCallbacks def get(self): ... a = yie

我处于一个奇怪的境地,我必须在一个完全由龙卷风构建的系统中使用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上工作,所以我认为这应该是好的。会不会有任何不可预见的后果?提前谢谢。

不,这样不行。在您的情况下,
inlineCallbacks
直接包装在生成器周围,
gen.engine
包装在外部。问题是,
inlineCallbacks
不知道有关
gen.Task
的任何信息,它会立即生成它(它无法将它传递给
gen.engine

详细说明:如果在
inlineCallbacks
包装的生成器中生成
obj
,可能会发生两件事:

  • obj
    是一个
    延迟的
    ,在这种情况下,控制返回反应堆,直到
    延迟的
    点火
  • 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
    ,请参阅

    正确的方法是什么?尝试使用
    inlineCallbacks
    gen.engine
    (但不能同时使用两者)。将外来
    gen.Task
    (或
    延迟
    )包装为“本机”形式。我不熟悉龙卷风,但可能


    或者,编写自己的装饰程序,比如
    inlineCallbacks
    ,它也可以处理
    gen.Task

    看起来像是一个Python的web服务器框架,它将Tornado API作为扭曲协议实现