我编写了一个简单的龙卷风应用程序,使用web-socket来管理守护进程(就像传输web界面一样)。困扰我的一件事是状态更新的实施。 我的WebSocketHandler只接收来自客户端的消息,执行必要的操作,检查状态并将其发送给客户端。它没有请求就不会向客户端发送状态。
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print('connected')
self.daemon = Daemon()
self.write_message(self.daemon.get_status())
def on_message(self, message):
if message == 'start':
self.daemon.start()
elif message == 'stop':
self.daemon.stop()
self.write_message(self.daemon.get_status())
def on_close(self):
print('disconnected')
我在客户端使用javascript的setInterval函数来请求状态更新,如下所示:
ws = new WebSocket("ws://localhost:8080/websocket");
ws.onopen = function () {
setInterval(function() {
if (ws.bufferedAmount == 0)
ws.send('status');
}, 1000);
};
}
如何在服务器端实现相同的结果,以便龙卷风在不阻塞on_message方法的情况下将当前状态发送给客户端?
答案 0 :(得分:6)
您可以使用tornado.ioloop.IOLoop.add_timeout
每X秒钟调用一次方法来更新客户端:
from tornado.ioloop import IOLoop
from datetime import timedelta
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print('connected')
self.daemon = Daemon()
self.write_message(self.daemon.get_status())
self.schedule_update()
def schedule_update(self):
self.timeout = IOLoop.instance().add_timeout(timedelta(seconds=5),
self.update_client)
def update_client(self):
try:
self.write_message(self.daemon.get_status())
finally:
self.schedule_update()
def on_close(self):
IOLoop.instance().remove_timeout(self.timeout)
print('disconnected')