在Tornado和Flask中运行@ gen.coroutine同步

时间:2015-08-21 11:53:10

标签: python asynchronous flask tornado

我在Tornado中遇到异步连接问题。我想通过访问Flask端点(/ async / ...)来创建获取页面主体的代理。然后它应该异步获取该页面的内容。但是我怎么能这样做呢?有一段我已经写过的片段。它打印response.body但是如何在proxyAsync中返回它以在网页上显示它?

@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    print('------------------')
    print(response.body)
    print('------------------')
    raise gen.Return(response.body)

@proxy_service.route('/async/<path:url>', methods=methodsHTTP)
def proxyAsync(url):
    # Send request
    response = fetch_coroutine(url)

    return jsonify({})

1 个答案:

答案 0 :(得分:0)

@ gen.coroutine返回gen.Future实例。这需要处理。否则龙卷风http_client fetch将无法完成。

您应该可以通过执行以下操作来使此代码段工作:

from tornado.ioloop import IOLoop
def proxyAsync(url):
    response = IOLoop.current().run_sync(fetch_coroutine(url))
    # I presume you wanted to return the response.
    return jsonify(response)

无论如何,你不会从异步http_fetch中获得任何好处,因为你的应用程序基于Flask。

您是否有特殊原因要使用Flask和Tornado? Tornado的Web框架很容易使用,然后你的异步http_fetch可以很好地与主应用程序的IOLoop保持一致。