我编写了一个简单的龙卷风应用程序,使用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')
Run Code Online (Sandbox Code Playgroud)
我在客户端使用javascript的setInterval函数来请求状态更新,如下所示:
ws = new WebSocket("ws://localhost:8080/websocket");
ws.onopen = function () {
setInterval(function() {
if (ws.bufferedAmount == 0)
ws.send('status');
}, 1000);
};
}
Run Code Online (Sandbox Code Playgroud)
如何在服务器端实现相同的结果,以便龙卷风在不阻塞on_message方法的情况下将当前状态发送给客户端?
您可以使用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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |