Бесконечный "фоновый" цикл для обработчика 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()