繁体   English   中英

将Twisted的@inlineCallbacks与Tornado的@ gen.engine一起使用

[英]Using Twisted's @inlineCallbacks with Tornado's @gen.engine

龙卷风/扭曲的纽伯在这里。 首先,我只想确认我所知道的(如果我错了,请正确并详细说明):

为了在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。 但是我可以这样做吗(即仅通过给它提供callback关键字参数就可以在gen.Task中使用@ defer.inlineCallbacks函数)? 我似乎得到了正确的结果,但是我的方式真的是异步运行吗? IOLoop是否有这种并发症/问题?

我实际上在其他线程上发布了一些相关的问题

可以将Tornado的gen.engine和gen.Task与Twisted一起使用吗?

同时使用龙卷风和扭曲

答案告诉我应该“包装” inlineCallback函数。 我想知道添加callback关键字是否足以“包装”扭曲的函数以适合Tornado。

提前致谢

您所做的大部分都很好:添加callback参数足以使gen.Task使用一个函数。 唯一棘手的部分是异常处理:您需要从exceptfinally块运行回调以确保它始终发生,并且可能应返回某种值以指示操作是否成功(异常无法可靠地通过)使用非龙卷风代码时通过gen.Task进行操作)

包装方法(我在“ 是否可以将Tornado的gen.engine和gen.Task与twist?一起使用”中发表 )有两个优点:它可以直接与大多数Twisted代码一起使用(因为Twisted函数通常没有callback参数) ),并且异常的工作方式更像您期望的那样(内部函数中引发的异常将传播到外部函数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM