次のコードは、単一の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)