class BroadcastWebsocketManager(object): def __init__(self): self.event_loop = asyncio.get_event_loop() ''' { 'hostname1': BroadcastWebsocketTask(), 'hostname2': BroadcastWebsocketTask(), 'hostname3': BroadcastWebsocketTask(), } ''' self.broadcast_tasks = dict() self.local_hostname = get_local_host() self.stats_mgr = BroadcastWebsocketStatsManager(self.event_loop, self.local_hostname) async def run_per_host_websocket(self): while True: known_hosts = await get_broadcast_hosts() future_remote_hosts = known_hosts.keys() current_remote_hosts = self.broadcast_tasks.keys() deleted_remote_hosts = set(current_remote_hosts) - set(future_remote_hosts) new_remote_hosts = set(future_remote_hosts) - set(current_remote_hosts) remote_addresses = {k: v.remote_host for k, v in self.broadcast_tasks.items()} for hostname, address in known_hosts.items(): if hostname in self.broadcast_tasks and address != remote_addresses[hostname]: deleted_remote_hosts.add(hostname) new_remote_hosts.add(hostname) if deleted_remote_hosts: logger.warning(f"Removing {deleted_remote_hosts} from websocket broadcast list") if new_remote_hosts: logger.warning(f"Adding {new_remote_hosts} to websocket broadcast list") for h in deleted_remote_hosts: self.broadcast_tasks[h].cancel() del self.broadcast_tasks[h] self.stats_mgr.delete_remote_host_stats(h) for h in new_remote_hosts: stats = self.stats_mgr.new_remote_host_stats(h) broadcast_task = BroadcastWebsocketTask(name=self.local_hostname, event_loop=self.event_loop, stats=stats, remote_host=known_hosts[h]) broadcast_task.start() self.broadcast_tasks[h] = broadcast_task await asyncio.sleep(settings.BROADCAST_WEBSOCKET_NEW_INSTANCE_POLL_RATE_SECONDS) def start(self): self.stats_mgr.start() self.async_task = self.event_loop.create_task(self.run_per_host_websocket()) return self.async_task
class BroadcastWebsocketManager(object): def __init__(self): self.event_loop = asyncio.get_event_loop() self.broadcast_tasks = dict() # parallel dict to broadcast_tasks that tracks stats self.local_hostname = get_local_host() self.stats_mgr = BroadcastWebsocketStatsManager( self.event_loop, self.local_hostname) async def run_per_host_websocket(self): while True: future_remote_hosts = get_broadcast_hosts() current_remote_hosts = self.broadcast_tasks.keys() deleted_remote_hosts = set(current_remote_hosts) - set( future_remote_hosts) new_remote_hosts = set(future_remote_hosts) - set( current_remote_hosts) if deleted_remote_hosts: logger.warn( f"{self.local_hostname} going to remove {deleted_remote_hosts} from the websocket broadcast list" ) if new_remote_hosts: logger.warn( f"{self.local_hostname} going to add {new_remote_hosts} to the websocket broadcast list" ) for h in deleted_remote_hosts: self.broadcast_tasks[h].cancel() del self.broadcast_tasks[h] self.stats_mgr.delete_remote_host_stats(h) for h in new_remote_hosts: stats = self.stats_mgr.new_remote_host_stats(h) broadcast_task = BroadcastWebsocketTask( name=self.local_hostname, event_loop=self.event_loop, stats=stats, remote_host=h) broadcast_task.start() self.broadcast_tasks[h] = broadcast_task await asyncio.sleep( settings.BROADCAST_WEBSOCKET_NEW_INSTANCE_POLL_RATE_SECONDS) def start(self): self.stats_mgr.start() self.async_task = self.event_loop.create_task( self.run_per_host_websocket()) return self.async_task