Бесконечный "фоновый" цикл для обработчика Tornado WebSockets

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

Чтобы было понятнее; скажем, у меня есть следующий обработчик WebSocket

class MyHandler(websocket.WebSocketHandler):

def auto_loop(self, *args, **kwargs):
    self.write_message('automatic message')

Есть ли способ запустить auto_loop на каждом цикле IOLoop, не блокируя основной поток?

Я предполагаю, что я могу использовать гринлеты для этого, но я ищу более родное решение Торнадо.

Спасибо

2 ответа

Решение

Вы не должны писать сообщение на каждом цикле IOLoop: вы перегружаете свою систему. Вы хотите отправить его каждые несколько миллисекунд или секунд. Сопрограмма будет делать хорошо:

import datetime

from tornado.ioloop import IOLoop
from tornado import gen

handlers = set()


@gen.coroutine
def auto_loop():
    while True:
        for handler in handlers:
            handler.write_message('automatic message')

        yield gen.Task(
            IOLoop.current().add_timeout,
            datetime.timedelta(milliseconds=500))

if __name__ == '__main__':
    # ... application setup ...

    # Start looping.
    auto_loop()
    IOLoop.current().start()

В MyHandler.open(), сделайте handlers.add(self), а в MyHandler.on_close() сделать handlers.discard(self),

Вы также можете быть заинтересованы в PeriodicCallback

http://tornado.readthedocs.org/en/latest/ioloop.html

def callback(self):

    self.write_message("Hi there!")

def open(self):
    self.write_message("Connected.")
    self.pCallback = PeriodicCallback(self.callback,
                                      callback_time=250)
    self.pCallback.start()
Другие вопросы по тегам