【问题标题】:Asynchronous calls from within sockjs-tornado methodssockjs-tornado 方法中的异步调用
【发布时间】:2012-09-04 21:17:22
【问题描述】:

我正在sockjs-tornado 上构建服务器,想知道如何利用 tornado 的异步 HTTP 客户端或其他用于 tornado 的异步工具,例如 asyncmongo、tornado-redis 等。显然无法使用随机方法上的 tornado.web.asynchronoustornado.gen.engine 装饰器。因此,如果我需要从 SockJSConnection 的 on_message() 中进行异步 Mongo/HTTP/Redis 调用,我该怎么做?

【问题讨论】:

    标签: websocket socket.io tornado sockjs


    【解决方案1】:

    你所要做的就是创建一个由 tornado.gen 装饰器装饰的方法(或函数)

    创建小要点来说明如何做到这一点:https://gist.github.com/3708549

    如果您将运行示例并检查服务器控制台,您将看到以下输出:

    1 - 提出请求

    2 - 从 on_message 返回

    ...稍有延迟...

    3 - 向客户端发送数据

    因此,它不会阻塞 ioloop,而是在后台进行 HTTP 调用。

    【讨论】:

    • 确实,感谢您的洞察力——我惊讶地发现 on_* 回调在 sockjs-tornado 中默认是异步的。 tornado RequestHandlers 的 get/post 处理程序方法不是这种情况,@asynchronous 装饰器是实现此行为所必需的。所以我正在使用它(与 gen.engine 一起),而前者抛出了一个异常。看来 sockjs-tornado 向前迈进了一步 :)
    • @Joes,你的主旨是,你还需要在handle_request 方法的末尾做self.finish() 吗?
    • 不,您不必调用 self.finish() - 只需使用您的异步方法。
    • @Joes,你真的可以在 sockjs-tornado 中使用 tornado.gen 装饰 on_message 方法本身吗?这与装饰您在on_message 中调用的单独方法相同吗?
    • 是的,on_message 可以进行装饰,它会按预期工作。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多