WebSocket Server envía mensajes periódicamente en Python

Tengo un servidor web de tornado en python:

import tornado.httpserver import tornado.websocket import tornado.ioloop from tornado.ioloop import IOLoop import tornado.web import time import threading import sys from datetime import datetime from datetime import timedelta def sample(): print 'hiiiii' threading.Timer(10, sample).start() class WSHandler(tornado.websocket.WebSocketHandler): def open(self): print 'new connection' def on_message(self, message): self.write_message(message) self.msg('hellooooooo') print message def msg(self,message): self.write_message(message) threading.Timer(10, self.msg('in timer')).start() print 'in msg'+message def on_close(self): print 'connection closed' application = tornado.web.Application([ (r'/', WSHandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8888) interval_ms=120 main_loop=tornado.ioloop.IOLoop.instance() main_loop.start() 

Y el cliente es

    function fun(){ alert("in fun()"); var val=document.getElementById("txt"); var ws = new WebSocket("ws://localhost:8888"); ws.onopen = function(evt) { alert("Connection open ..."); ws.send(val.value); }; ws.onmessage = function(evt) { alert("from server: "+evt.data); } ws.onclose = function(evt) { alert("Connection closed."); } }        

Quiero enviar el mensaje periódicamente al cliente. Pero cuando bash esto, obtengo este error: RunTimeError :Maximum Recursion Depth Exceeded. Por favor ayudame a resolver este problema. Además, ¿cómo sabemos cuáles son los clientes conectados al servidor?

Aquí hay un ejemplo mínimo usando el PeriodicCallback .

 import tornado.httpserver import tornado.websocket import tornado.ioloop from tornado.ioloop import PeriodicCallback import tornado.web class WSHandler(tornado.websocket.WebSocketHandler): def open(self): self.callback = PeriodicCallback(self.send_hello, 120) self.callback.start() def send_hello(self): self.write_message('hello') def on_message(self, message): pass def on_close(self): self.callback.stop() application = tornado.web.Application([ (r'/', WSHandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8888) tornado.ioloop.IOLoop.instance().start() 

Usted está llamando a la función en lugar de iniciar un temporizador. Hacer esto:

 threading.Timer(10, self.msg, args =('in timer',)).start() 

¿Podrían ayudarte esos ejemplos?

Ejemplo de tornado

También esto también Documentación tornado WS