Python 同时使用龙卷风和扭曲
我处于一个奇怪的境地,我必须在一个完全由龙卷风构建的系统中使用Twisted。 他们可以共享同一个IOLoop,所以我知道他们可以一起工作。我的问题是,我能在同一个函数中安全地使用它们的共同例程装饰器吗?例如: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
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作为扭曲协议实现