4

我想创建一个使用Tornado的WebSocket服务器。我想要做的是执行一个特定的命令,它将为IOLoop的每个周期发送一条消息。Tornado WebSockets处理程序的无限“背景”循环

使其更清楚;比方说,我有以下的WebSocket处理器

class MyHandler(websocket.WebSocketHandler): 

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

有什么办法上运行的每个IOLoop周期auto_loop,而不会阻塞主线程?

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

谢谢

回答

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

在MyHandler.open(),做handlers.add(self),并在MyHandler.on_close()做handlers.discard(self)