Tornado WebSockets处理程序的无限"背景"循环

Par*_*ris 4 tornado nonblocking infinite-loop websocket python-multithreading

我正在尝试使用Tornado创建一个WebSocket服务器.我想要做的是执行一个特定的命令,它将为IOLoop的每个循环发送一条消息.

使它更清楚; 假设我有以下WebSocket处理程序

class MyHandler(websocket.WebSocketHandler):

def auto_loop(self, *args, **kwargs):
    self.write_message('automatic message')
Run Code Online (Sandbox Code Playgroud)

有没有办法auto_loop在每个IOLoop循环上运行,而不会阻塞主线程?

我想我可以使用greenlets,但我正在寻找更多的Tornado原生解决方案.

谢谢

A. *_*vis 6

你不应该在每个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()
Run Code Online (Sandbox Code Playgroud)

在MyHandler.open()中,执行handlers.add(self),并在MyHandler.on_close()中执行handlers.discard(self).