2013-07-04 40 views
10

Tôi đang cố gắng kết hợp với nhau một thử nghiệm cho phép các máy khách web kết nối với máy chủ Tornado và tôi muốn máy chủ Tornado gửi thông báo tới tất cả các máy khách mỗi X giây.python Tornado websockets cách gửi tin nhắn mỗi X giây?

Lý do tôi làm điều này là do các kết nối ổ cắm đang được thả âm thầm ở đâu đó và tôi tự hỏi về các "ping" định kỳ được gửi bởi máy chủ websockets sẽ duy trì kết nối.

Tôi e rằng đó là một câu hỏi khá ngớ ngẩn và đoạn mã dưới đây là một mớ hỗn độn. Tôi chỉ không có đầu quấn quanh Tornado và đủ rộng để làm cho nó hoạt động.

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

Trả lời

9

Tại sao bạn không thử viết lịch lên bên trong? :)

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

Tìm thấy rằng câu trả lời chấp nhận cho điều này là gần như chính xác những gì tôi muốn:

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

Với một sửa đổi nhỏ, câu trả lời được chấp nhận tại các diễn đàn liên tục gửi đi các tin ping. Đây là mod:

Thay đổi:

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

tới:

def test(self): 
    self.write_message("scheduled!") 
    tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=5), self.test) 
Các vấn đề liên quan