以下代码运行一个while True
循环,并为所有侦听器提供相同的数据。它按我的意图工作,但我认为它很丑。有没有更好的方法来实现这一目标?
实际上,我将跟踪 MongoDB oplog,解析输出并只为感兴趣的听众提供服务。在这种情况下,listeners
将是一个键为 ObjectID 的字典,例如一个 WebSocketHandlers 数组。这听起来是个好主意吗?
class TestHandler(WebSocketHandler):
running = False
listeners = []
@gen.coroutine
def open(self):
TestHandler.listeners.append(self)
if not TestHandler.running:
TestHandler.start_stream()
def on_close(self):
TestHandler.listeners.remove(self)
@staticmethod
@gen.coroutine
def start_stream():
# this will in reality tail mongodb oplog and serve changes
# but this is nice enough to demonstrate the problem
TestHandler.running = True
i = 0
while True:
for socket in TestHandler.listeners:
socket.write_message(str(i))
i += 1
loop = IOLoop.instance()
yield gen.Task(loop.add_timeout, time.time() + 1)