龍捲風/扭曲的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。
在此先感謝