1

次のコードは、単一のwhile Trueループを実行し、すべてのリスナーに同じデータを提供します。意図したとおりに機能しますが、醜いと思います。これを達成するためのより良い方法はありますか?

実際には、MongoDB oplog を追跡し、出力を解析して、関心のあるリスナーのみにサービスを提供します。その場合listeners、たとえばキーが ObjectID であり、値が WebSocketHandlers の配列である dict になります。これは良いアイデアのように聞こえますか?

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