2013-07-04 12 views
10

Próbuję połączyć test, który pozwala klientom sieci web połączyć się z serwerem Tornado i chcę, aby serwer Tornado wysyłał wiadomości do wszystkich klientów co X sekund.Python Tornado websockets jak wysłać wiadomość co X sekund?

Powodem, dla którego to robię, jest to, że połączenia wtyki są po cichu upuszczane gdzieś i zastanawiam się, czy okresowe "pingi" wysłane przez serwer websockets utrzymają połączenie.

Obawiam się, że jest to całkiem nieobowiązkowe pytanie, a poniższy kod to raczej bałagan. Po prostu nie mam głowy owiniętej wokół Tornada i zasięgu wystarczającego, żeby to zadziałało.

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() 

Odpowiedz

9

Dlaczego nie wypiszesz w nim terminarza? :)

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() 
3

Stwierdzono, że przyjęte odpowiedź na to prawie dokładnie to, co chcę:

How to run functions outside websocket loop in python (tornado)

z niewielkimi zmianami, przyjętą odpowiedź na powyższy link stale wysyła komunikaty ping. Oto mod:

Zmiana:

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

do:

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