"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo implementar la transmisión de servidor a cliente en gRPC?

¿Cómo implementar la transmisión de servidor a cliente en gRPC?

Publicado el 2024-11-05
Navegar:545

How to Implement Server to Client Broadcasting in gRPC?

Transmisión en gRPC: comunicación de servidor a cliente

Al establecer una conexión gRPC, a menudo es necesario transmitir eventos o actualizaciones desde el servidor a clientes conectados. Para lograr esto, se pueden emplear varios enfoques.

Stream Observables

Un enfoque común es utilizar flujos del lado del servidor. Cada cliente conectado establece su propia transmisión con el servidor. Sin embargo, no es factible suscribirse directamente a otras transmisiones servidor-cliente.

Encuesta larga

Una opción alternativa es implementar un enfoque de encuesta larga. Esto implica que los clientes sondeen continuamente el servidor a intervalos regulares, buscando nuevas actualizaciones. Al recibir una actualización, el cliente recibirá una respuesta y esperará el siguiente intervalo de sondeo.

Ejemplo de implementación

Aquí se muestra un ejemplo de cómo implementar un sondeo largo usando gRPC:

Código del lado del servidor

import threading

class UpdaterServer:
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            self.updates.append(updates)
            self.condition.notify_all()

    def GetUpdates(self, req, context):
        with self.condition:
            while self.updates[req.last_received_update   1:] == []:
                self.condition.wait()
            new_updates = self.updates[req.last_received_update   1:]
            return GetUpdatesResponse(
                updates=new_updates,
                update_index=req.last_received_update   len(new_updates),
            )

Código del lado del cliente (tema independiente)

from threading import Event

def handle_updates(updates):
    pass

event = Event()
request = GetUpdatesRequest(last_received_update=-1)

while not event.is_set():
    try:
        stub = UpdaterStub(channel)
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass

Al implementar este enfoque, los clientes conectados pueden recuperar actualizaciones del servidor de forma continua.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3