Websocket 来自sockjs tornado方法内部的异步调用

Websocket 来自sockjs tornado方法内部的异步调用,websocket,socket.io,tornado,sockjs,Websocket,Socket.io,Tornado,Sockjs,我正在构建一个服务器,想知道人们如何利用tornado的异步HTTP客户端——或者tornado的其他异步工具,如asyncmongo、tornado redis等。显然,在随机方法上使用tornado.web.asynchronous&tornado.gen.engine装饰程序是不可能的。因此,如果我需要在SockJSConnection的on_message()中执行异步Mongo/HTTP/Redis调用,我该如何做呢?您需要做的就是创建一个由tornado.gen decorator修

我正在构建一个服务器,想知道人们如何利用tornado的异步HTTP客户端——或者tornado的其他异步工具,如asyncmongo、tornado redis等。显然,在随机方法上使用
tornado.web.asynchronous
&
tornado.gen.engine
装饰程序是不可能的。因此,如果我需要在SockJSConnection的
on_message()
中执行异步Mongo/HTTP/Redis调用,我该如何做呢?

您需要做的就是创建一个由tornado.gen decorator修饰的方法(或函数)

创建小要点来说明如何做到这一点:

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

1-提出要求

2-从on_消息返回

。。。稍有延迟

3-向客户端发送数据


因此,它没有阻止ioloop并在后台进行HTTP调用。

事实上,感谢您的洞察力——我惊讶地发现,在sockjs tornado中,on_*callbacks在默认情况下是异步的。tornado RequestHandlers的get/post处理程序方法并非如此,其中@asynchronous decorator是实现此行为所必需的。所以我在使用它(和gen.engine一起使用),而前者抛出了一个异常。看来sockjs tornado向前迈出了一步:)@Joes,在你的要点中,你是否还需要在
handle\u request
method的末尾执行
self.finish()
?不,你不必调用self.finish()-只需使用你的异步方法。@Joes,你真的可以用
tornado.gen
在sockjs tornado中的消息上装饰
方法本身吗?这与在消息上的
中调用装饰一个单独的方法相同吗?是的,消息上的
可以装饰,它将按预期工作。