【发布时间】:2013-10-22 00:10:26
【问题描述】:
Tornado/Twisted newb 在这里。首先我只是想确认一下我所知道的(如果我错了,请更正并详细说明):
为了在 Tornado 中使用 @gen.engine 和 gen.Task,我需要提供以下 gen.Task() 函数:
- 异步开始
- 有关键字参数“回调”
- 最后调用回调函数
换句话说,函数应该如下所示:
def function(arg1, arg2, ... , callback=None):
# asynchronous stuff here ...
callback()
我会这样称呼它(简单的例子):
@gen.engine
def coroutine_call():
yield gen.Task(function, arg1, arg2)
现在我处于一个奇怪的情况,我必须在 Tornado 系统中使用 Twisted 来异步客户端调用服务器(因为 Tornado 显然不支持它)。
所以我在 Twisted 中写了一个函数(例如连接到服务器):
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 和 Tornado 可以共享同一个 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。
提前致谢
【问题讨论】:
标签: python asynchronous client-server twisted tornado