Я создавал приложение, в котором, как только поступил запрос на обновление, прослушиватель событий sqlalchemy запустит и отправит обновленные данные всем клиентам, подключенным к конечной точке SSE.
код для sqlalchemy:
class Process(Base):
__tablename__ = "Process"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String)
status = Column(String)
@event.listens_for(Process, 'after_update')
def receive_after_update(mapper, connection, target):
print(">>>> by event: ", target.status)
data = {
"name": target.name,
"status": target.status
}
from connexapi.APP.sse import notify
notify(json.dumps(data))
# dataQueue.put(data)
Для создания SSE я использовал flask и создал функцию генератора с бесконечностью, пока l oop
def push():
def generate():
while True:
if not dataQueue.empty():
yield f"data: {json.dumps(dataQueue.get())}\n\n"
return Response(generate(), mimetype="text/event-stream")
работает, когда есть только один клиент. Итак, я создал список подписки на основе каждого нового запроса. Хотя это решает проблему, дополнительные клиенты, теперь каждый клиент в какое-то время l oop и всегда слушает, не прерываясь.
Новый код выглядит так:
def event_stream():
"""Generate an event stream."""
subscription = Queue()
subscriptions.append(subscription)
# Send a comment line to prevent request timeouts
# subscription.put(':keep-alive\n\n')
while True:
if not subscription.empty():
yield f"data: {subscription.get()}\n\n"
def stream():
"""Generate an event stream.
Returns:
Status code 200 as events are generated successfully.
"""
return Response(event_stream(), mimetype='text/event-stream')
для каждого запроса, очередь создается и добавляется в список подписки. Событие Sqlalchemy вызывает метод для обновления / помещения данных во все очереди.
Но это очень противоречиво и требует много ресурсов. Мне нужен способ создать ту же функциональность лучше, используя отправленные сервером события без времени l oop. Так что всякий раз, когда БД обновляется, все клиенты должны получать обновленные данные с явным запросом или опросом.
Любая помощь приветствуется Спасибо