Files
hse-2026/materials/02-communication/grpc-streaming/server/server.py
T

65 lines
1.7 KiB
Python
Raw Normal View History

2026-09-14 14:45:31 +03:00
import grpc
import os
import queue_pb2
import queue_pb2_grpc
from collections import deque
from concurrent import futures
from datetime import datetime
from google.protobuf.timestamp_pb2 import Timestamp
from threading import Lock
class Queue:
data = deque()
lock = Lock()
@classmethod
def push(cls, value):
with cls.lock:
cls.data.append(value)
@classmethod
def pop(cls):
with cls.lock:
if len(cls.data) > 0:
return cls.data.popleft()
else:
return None
@classmethod
def drain(cls):
with cls.lock:
data = list(cls.data)
cls.data = deque()
return data
class QueueService(queue_pb2_grpc.QueueServicer):
def Push(self, request, context):
request.value.updated_at.GetCurrentTime()
Queue.push(request.value)
return queue_pb2.PushResponse()
def PushMany(self, request_iterator, context):
for request in request_iterator:
request.value.updated_at.GetCurrentTime()
Queue.push(request.value)
return queue_pb2.PushResponse()
def Pop(self, request, context):
return queue_pb2.PopResponse(value=Queue.pop())
def Drain(self, request, context):
for item in Queue.drain():
yield queue_pb2.PopResponse(value=item)
if __name__ == '__main__':
server_addr = os.getenv('SERVER_ADDR', 'localhost:51000')
server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
queue_pb2_grpc.add_QueueServicer_to_server(QueueService(), server)
server.add_insecure_port(server_addr)
server.start()
server.wait_for_termination(timeout=None)