使用Tornado向客户端发送间歇性更新

时间:2014-06-17 20:06:45

标签: python tornado

我编写了一个简单的龙卷风应用程序,使用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方法的情况下将当前状态发送给客户端?

1 个答案:

答案 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')