Трансляция в gRPC: связь между сервером и клиентом
При установке соединения gRPC часто необходимо транслировать события или обновления с сервера на подключенные клиенты. Для достижения этой цели можно использовать различные подходы.
Наблюдаемые потоки
Одним из распространенных подходов является использование потоков на стороне сервера. Каждый подключенный клиент устанавливает свой собственный поток с сервером. Однако подписка на другие потоки сервер-клиент напрямую невозможна.
Длинный опрос
Альтернативным вариантом является реализация подхода с длительным опросом. Это предполагает, что клиенты будут постоянно опрашивать сервер через регулярные промежутки времени, проверяя наличие новых обновлений. После получения обновления клиент получит ответ и будет ждать следующего интервала опроса.
Пример реализации
Вот пример реализации длительного опроса. использование gRPC:
Серверный код
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),
)
Код на стороне клиента (отдельный поток)
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
Благодаря реализации этого подхода подключенные клиенты могут непрерывно получать обновления с сервера.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3