簡體   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