2013-10-22 72 views
1

龍捲風/扭曲的newb在這裏。首先,我只想確認我所知道的內容(請糾正並詳細說明我的錯誤):在Tornado的@ gen.engine中使用Twisted的@inlineCallbacks

爲了在Tornado中使用@ gen.engine和gen.Task,我需要提供gen.Task()函數,分別是:

  • 異步開始與
  • 有關鍵字參數「回調」
  • 在最後

換句話說調用回調函數的函數看起來應該如T他:

def function(arg1, arg2, ... , callback=None): 

    # asynchronous stuff here ... 

    callback() 

而且我會這樣稱呼它(小例子):

@gen.engine 
def coroutine_call(): 

    yield gen.Task(function, arg1, arg2) 

現在我在一個奇怪的情況下,我必須使用雙絞線龍捲風系統的異步客戶端調用一臺服務器(因爲Tornado顯然不支持它)。

所以我在扭曲的寫了一個函數(例如連接到服務器):

import tornado.platform.twisted 
tornado.platform.twisted.install() 
from twisted.web.xmlrpc import Proxy 

class AsyncConnection(): 
    def __init__(self, hostname): 
     self.proxy = Proxy(hostname) 
     self.token = False 

    @defer.inlineCallbacks 
    def login(self, user, passwd, callback=None): 
     """Login to server using given username and password""" 

     self.token = yield self.proxy.callRemote('login', user, passwd) # twisted function 
     callback() 

如果我運行它,就像這樣:

@gen.engine 
def test(): 

    conn = AsyncConnection("192.168.11.11") 
    yield gen.Task(conn.login, "user","pwd") 
    print conn.token 

if __name__ == '__main__': 
    test() 
    tornado.ioloop.IOLoop.instance().start() 

,我也獲得令牌,因爲我想。但我的問題是:

我知道Twisted和龍捲風可以共享相同的IOLoop。但我允許這樣做嗎(即通過給它一個回調關鍵字參數,在gen.Task中使用@ defer.inlineCallbacks函數)?我似乎得到了正確的結果,但我的方式是真正異步運行的東西? IOLoop的任何併發症/問題如何?

我其實張貼在其他線程

Is it possible to use tornado's gen.engine and gen.Task with twisted?

Using Tornado and Twisted at the same time

和答案多少有些相關的問題告訴我,我應該「包裝」的inlineCallback功能。我想知道是否添加回調關鍵字足以「包裝」扭曲的函數以適合Tornado。

在此先感謝

回答

2

你在做什麼大多是罰款:添加callback說法是足以讓一個函數可用與gen.Task。唯一棘手的部分是異常處理:您需要從exceptfinally塊中運行回調以確保它始終發生,並且應該返回某種值來指示操作是否成功(異常不會可靠地通過通過gen.Task當你使用非Tornado代碼)

包裝方法(我發佈在Is it possible to use tornado's gen.engine and gen.Task with twisted?)有兩個優點:它可以直接與大多數Twisted代碼一起使用(因爲Twisted函數通常沒有一個callback參數),並且異常工作更像您期望的(內部函數中引發的異常將傳播到外部函數)。

相關問題