14 """The Python example of utilizing wait-for-ready flag."""
17 from contextlib
import contextmanager
20 from typing
import Iterable
24 helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
27 _LOGGER = logging.getLogger(__name__)
28 _LOGGER.setLevel(logging.INFO)
34 tcp_socket = socket.socket(socket.AF_INET6)
36 tcp_socket = socket.socket(socket.AF_INET)
37 tcp_socket.bind((
'', 0))
38 address_tuple = tcp_socket.getsockname()
39 yield f
"localhost:{address_tuple[1]}"
45 async
def SayHello(self, request: helloworld_pb2.HelloRequest,
46 unused_context) -> helloworld_pb2.HelloReply:
51 server = grpc.aio.server()
53 bound_port = server.add_insecure_port(server_address)
54 assert bound_port ==
int(server_address.split(
':')[-1])
58 async
def process(stub: helloworld_pb2_grpc.GreeterStub,
59 wait_for_ready: bool =
None) ->
None:
62 wait_for_ready=wait_for_ready)
63 message = response.message
65 assert rpc_error.code() == grpc.StatusCode.UNAVAILABLE
66 assert not wait_for_ready
70 _LOGGER.info(
"Wait-for-ready %s, client received: %s",
71 "enabled" if wait_for_ready
else "disabled", message)
78 channel = grpc.aio.insecure_channel(server_address)
82 fail_fast_task = asyncio.get_event_loop().create_task(
83 process(stub, wait_for_ready=
False))
85 wait_for_ready_task = asyncio.get_event_loop().create_task(
86 process(stub, wait_for_ready=
True))
89 state = channel.get_state()
90 while state != grpc.ChannelConnectivity.TRANSIENT_FAILURE:
91 await channel.wait_for_state_change(state)
92 state = channel.get_state()
101 await wait_for_ready_task
103 await server.stop(
None)
104 await channel.close()
107 if __name__ ==
'__main__':
108 logging.basicConfig(level=logging.INFO)
109 asyncio.get_event_loop().run_until_complete(
main())