Python Tornado websockets, как отправлять сообщения каждые X секунд?

Я пытаюсь объединить тест, который позволяет клиентам websockets подключаться к серверу Tornado, и я хочу, чтобы сервер Tornado отправлял сообщение всем клиентам каждые X секунд.

Причина, по которой я делаю это, - это то, что соединения wbesockets молча удаляются где-то, и мне интересно, как периодические "пинги", отправленные сервером веб-серверов, будут поддерживать соединение.

Я боюсь, что это довольно нубийский вопрос, а приведенный ниже код скорее беспорядок. У меня просто нет моей головы, обернутой вокруг Торнадо и охвата достаточно, чтобы заставить ее работать.

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import tornado.gen
import time
from tornado import gen

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'http://mailapp.crowdwave.com/girlthumb.jpg'
        self.write_message("http://www.example.com/girlthumb.jpg")

    def on_message(self, message):
        print 'Incoming message:', message
        self.write_message("http://www.example.com/girlthumb.jpg")


    def on_close(self):
        print 'Connection was closed...'

@gen.engine
def f():
    yield gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 8)
    self.write_message("http://www.example.com/x.png")
    print 'x'

@gen.engine
def g():
     yield gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 4)
     self.write_message("http://www.example.com/y.jpg")
     print 'y'

application = tornado.web.Application([
    (r'/ws', WSHandler),
    ])

if __name__ == "__main__":
    tornado.ioloop.IOLoop.instance().add_callback(f)
    tornado.ioloop.IOLoop.instance().add_callback(g)
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Ответ 1

Почему бы вам не попробовать написать планировщик внутри него?:)

def schedule_func():
    #DO SOMETHING#

#milliseconds
interval_ms = 15
main_loop = tornado.ioloop.IOLoop.instance()
sched = tornado.ioloop.PeriodicCallback(schedule_func,interval_ms, io_loop = main_loop)
#start your period timer
sched.start()
#start your loop
main_loop.start()

Ответ 2

Обнаружил, что принятый ответ для этого - это почти то, что я хочу:

Как запускать функции за пределами цикла websocket в python (торнадо)

При незначительной модификации принятый ответ на указанную выше ссылку постоянно отправляет сообщения ping. Вот мода:

Изменить:

def test(self):
    self.write_message("scheduled!")

в

def test(self):
    self.write_message("scheduled!")
    tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=5), self.test)