Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用扭曲的';s@inlineCallbacks与Tornado';s@gen.engine_Python_Asynchronous_Client Server_Twisted_Tornado - Fatal编程技术网

Python 使用扭曲的';s@inlineCallbacks与Tornado';s@gen.engine

Python 使用扭曲的';s@inlineCallbacks与Tornado';s@gen.engine,python,asynchronous,client-server,twisted,tornado,Python,Asynchronous,Client Server,Twisted,Tornado,龙卷风/扭曲的新手。首先,我只想确认我所知道的(如果我错了,请更正并详细说明): 为了在Tornado中使用@gen.engine和gen.Task,我需要提供gen.Task()函数,这些函数是: 首先是异步的 具有关键字参数“callback” 在最后调用回调函数 换句话说,函数应该如下所示: def function(arg1, arg2, ... , callback=None): # asynchronous stuff here ... callback()

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

为了在Tornado中使用@gen.engine和gen.Task,我需要提供gen.Task()函数,这些函数是:

  • 首先是异步的
  • 具有关键字参数“callback”
  • 在最后调用回调函数
换句话说,函数应该如下所示:

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

    # asynchronous stuff here ...

    callback()
我会这样称呼它(简单的例子):

现在我遇到了一个奇怪的情况,我必须在Tornado系统中使用Twisted对服务器进行异步客户端调用(因为Tornado显然不支持它)

因此,我用Twisted编写了一个函数(例如,连接到服务器):

如果我像这样运行它:

@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函数,只需给它一个callback关键字参数)?我似乎得到了正确的结果,但我的方式真的是异步运行吗?IOLoop有这样的并发症/问题吗

实际上,我在其他帖子上发布了一些相关的问题

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


提前感谢

您所做的大部分工作都很好:添加
回调
参数就足以使函数可用于gen.Task。唯一棘手的部分是异常处理:您需要从
except
finally
块运行回调,以确保它总是发生,并且可能应该返回某种值来指示操作是否成功(使用非Tornado代码时,异常不会可靠地通过
gen.Task

包装器方法(我在中发布)有两个优点:它可以直接用于大多数扭曲的代码(因为扭曲的函数通常没有
回调
参数),而异常的工作方式更像您预期的那样(在内部函数中引发的异常将传播到外部函数)

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()