xref: /aosp_15_r20/external/grpc-grpc/examples/python/compression/server.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2019 the gRPC authors.
2*cc02d7e2SAndroid Build Coastguard Worker#
3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker#
7*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker#
9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker"""An example of compression on the server side with gRPC."""
15*cc02d7e2SAndroid Build Coastguard Worker
16*cc02d7e2SAndroid Build Coastguard Workerfrom __future__ import absolute_import
17*cc02d7e2SAndroid Build Coastguard Workerfrom __future__ import division
18*cc02d7e2SAndroid Build Coastguard Workerfrom __future__ import print_function
19*cc02d7e2SAndroid Build Coastguard Worker
20*cc02d7e2SAndroid Build Coastguard Workerimport argparse
21*cc02d7e2SAndroid Build Coastguard Workerfrom concurrent import futures
22*cc02d7e2SAndroid Build Coastguard Workerimport logging
23*cc02d7e2SAndroid Build Coastguard Workerimport threading
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Workerimport grpc
26*cc02d7e2SAndroid Build Coastguard Workerimport helloworld_pb2
27*cc02d7e2SAndroid Build Coastguard Workerimport helloworld_pb2_grpc
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard Worker_DESCRIPTION = "A server capable of compression."
30*cc02d7e2SAndroid Build Coastguard Worker_COMPRESSION_OPTIONS = {
31*cc02d7e2SAndroid Build Coastguard Worker    "none": grpc.Compression.NoCompression,
32*cc02d7e2SAndroid Build Coastguard Worker    "deflate": grpc.Compression.Deflate,
33*cc02d7e2SAndroid Build Coastguard Worker    "gzip": grpc.Compression.Gzip,
34*cc02d7e2SAndroid Build Coastguard Worker}
35*cc02d7e2SAndroid Build Coastguard Worker_LOGGER = logging.getLogger(__name__)
36*cc02d7e2SAndroid Build Coastguard Worker
37*cc02d7e2SAndroid Build Coastguard Worker_SERVER_HOST = "localhost"
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard Worker
40*cc02d7e2SAndroid Build Coastguard Workerclass Greeter(helloworld_pb2_grpc.GreeterServicer):
41*cc02d7e2SAndroid Build Coastguard Worker    def __init__(self, no_compress_every_n):
42*cc02d7e2SAndroid Build Coastguard Worker        super(Greeter, self).__init__()
43*cc02d7e2SAndroid Build Coastguard Worker        self._no_compress_every_n = no_compress_every_n
44*cc02d7e2SAndroid Build Coastguard Worker        self._request_counter = 0
45*cc02d7e2SAndroid Build Coastguard Worker        self._counter_lock = threading.RLock()
46*cc02d7e2SAndroid Build Coastguard Worker
47*cc02d7e2SAndroid Build Coastguard Worker    def _should_suppress_compression(self):
48*cc02d7e2SAndroid Build Coastguard Worker        suppress_compression = False
49*cc02d7e2SAndroid Build Coastguard Worker        with self._counter_lock:
50*cc02d7e2SAndroid Build Coastguard Worker            if (
51*cc02d7e2SAndroid Build Coastguard Worker                self._no_compress_every_n
52*cc02d7e2SAndroid Build Coastguard Worker                and self._request_counter % self._no_compress_every_n == 0
53*cc02d7e2SAndroid Build Coastguard Worker            ):
54*cc02d7e2SAndroid Build Coastguard Worker                suppress_compression = True
55*cc02d7e2SAndroid Build Coastguard Worker            self._request_counter += 1
56*cc02d7e2SAndroid Build Coastguard Worker        return suppress_compression
57*cc02d7e2SAndroid Build Coastguard Worker
58*cc02d7e2SAndroid Build Coastguard Worker    def SayHello(self, request, context):
59*cc02d7e2SAndroid Build Coastguard Worker        if self._should_suppress_compression():
60*cc02d7e2SAndroid Build Coastguard Worker            context.set_compression(grpc.Compression.NoCompression)
61*cc02d7e2SAndroid Build Coastguard Worker        return helloworld_pb2.HelloReply(message="Hello, %s!" % request.name)
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard Workerdef run_server(server_compression, no_compress_every_n, port):
65*cc02d7e2SAndroid Build Coastguard Worker    server = grpc.server(
66*cc02d7e2SAndroid Build Coastguard Worker        futures.ThreadPoolExecutor(),
67*cc02d7e2SAndroid Build Coastguard Worker        compression=server_compression,
68*cc02d7e2SAndroid Build Coastguard Worker        options=(("grpc.so_reuseport", 1),),
69*cc02d7e2SAndroid Build Coastguard Worker    )
70*cc02d7e2SAndroid Build Coastguard Worker    helloworld_pb2_grpc.add_GreeterServicer_to_server(
71*cc02d7e2SAndroid Build Coastguard Worker        Greeter(no_compress_every_n), server
72*cc02d7e2SAndroid Build Coastguard Worker    )
73*cc02d7e2SAndroid Build Coastguard Worker    address = "{}:{}".format(_SERVER_HOST, port)
74*cc02d7e2SAndroid Build Coastguard Worker    server.add_insecure_port(address)
75*cc02d7e2SAndroid Build Coastguard Worker    server.start()
76*cc02d7e2SAndroid Build Coastguard Worker    print("Server listening at '{}'".format(address))
77*cc02d7e2SAndroid Build Coastguard Worker    server.wait_for_termination()
78*cc02d7e2SAndroid Build Coastguard Worker
79*cc02d7e2SAndroid Build Coastguard Worker
80*cc02d7e2SAndroid Build Coastguard Workerdef main():
81*cc02d7e2SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(description=_DESCRIPTION)
82*cc02d7e2SAndroid Build Coastguard Worker    parser.add_argument(
83*cc02d7e2SAndroid Build Coastguard Worker        "--server_compression",
84*cc02d7e2SAndroid Build Coastguard Worker        default="none",
85*cc02d7e2SAndroid Build Coastguard Worker        nargs="?",
86*cc02d7e2SAndroid Build Coastguard Worker        choices=_COMPRESSION_OPTIONS.keys(),
87*cc02d7e2SAndroid Build Coastguard Worker        help="The default compression method for the server.",
88*cc02d7e2SAndroid Build Coastguard Worker    )
89*cc02d7e2SAndroid Build Coastguard Worker    parser.add_argument(
90*cc02d7e2SAndroid Build Coastguard Worker        "--no_compress_every_n",
91*cc02d7e2SAndroid Build Coastguard Worker        type=int,
92*cc02d7e2SAndroid Build Coastguard Worker        default=0,
93*cc02d7e2SAndroid Build Coastguard Worker        nargs="?",
94*cc02d7e2SAndroid Build Coastguard Worker        help="If set, every nth reply will be uncompressed.",
95*cc02d7e2SAndroid Build Coastguard Worker    )
96*cc02d7e2SAndroid Build Coastguard Worker    parser.add_argument(
97*cc02d7e2SAndroid Build Coastguard Worker        "--port",
98*cc02d7e2SAndroid Build Coastguard Worker        type=int,
99*cc02d7e2SAndroid Build Coastguard Worker        default=50051,
100*cc02d7e2SAndroid Build Coastguard Worker        nargs="?",
101*cc02d7e2SAndroid Build Coastguard Worker        help="The port on which the server will listen.",
102*cc02d7e2SAndroid Build Coastguard Worker    )
103*cc02d7e2SAndroid Build Coastguard Worker    args = parser.parse_args()
104*cc02d7e2SAndroid Build Coastguard Worker    run_server(
105*cc02d7e2SAndroid Build Coastguard Worker        _COMPRESSION_OPTIONS[args.server_compression],
106*cc02d7e2SAndroid Build Coastguard Worker        args.no_compress_every_n,
107*cc02d7e2SAndroid Build Coastguard Worker        args.port,
108*cc02d7e2SAndroid Build Coastguard Worker    )
109*cc02d7e2SAndroid Build Coastguard Worker
110*cc02d7e2SAndroid Build Coastguard Worker
111*cc02d7e2SAndroid Build Coastguard Workerif __name__ == "__main__":
112*cc02d7e2SAndroid Build Coastguard Worker    logging.basicConfig()
113*cc02d7e2SAndroid Build Coastguard Worker    main()
114