Я нашел решение, которое работает.Когда сообщение обновляется, у меня происходит событие потока и вызывается его метод set.
class Status:
def __init__(self, *args, **kwargs):
self.status = pb2.Status(*args, **kwargs)
self.event = None
def __setattr__(self, key, value):
if key == 'status' or key == 'event':
super().__setattr__(key, value)
else:
super().__getattribute__('status').__setattr__(key, value)
super().__getattribute__('event').set()
def __getattr__(self, item):
if item == 'event' or item == 'status':
return super().__getattribute__(item)
else:
return super().__getattribute__('status').__getattribute__(item)
event = threading.Event()
status = Status(version="1",
)
status_streamer = StatusStreamer(status, event)
status.event = event
status.version = str(int(status.version) + 1) #this triggers set to be called inside setattr, which results in the threads in SatusStreamer to stream the update
Это немного глупо, но поскольку мы не можем подклассифицировать сообщение, это приемлемо.статус - это сообщение, а событие - событие потока, когда эти элементы назначаются и запускаются, они не инициируют устанавливаемое событие.Однако, когда ему назначаются любые другие атрибуты, запускается .set (), которая приводит к обновлению клиентов.