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)