1

以下代码运行一个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)
4

0 回答 0