Как отправить обновленные данные БД в режиме реального времени, используя приложение для отправки событий с сервера, используя python и flask для клиентов? - PullRequest
0 голосов
/ 18 апреля 2020

Я создавал приложение, в котором, как только поступил запрос на обновление, прослушиватель событий 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. Так что всякий раз, когда БД обновляется, все клиенты должны получать обновленные данные с явным запросом или опросом.

Любая помощь приветствуется Спасибо

...