1*cc02d7e2SAndroid Build Coastguard Worker# gRPC Python Non-Blocking Streaming RPC Client Example 2*cc02d7e2SAndroid Build Coastguard Worker 3*cc02d7e2SAndroid Build Coastguard WorkerThe goal of this example is to demonstrate how to handle streaming responses 4*cc02d7e2SAndroid Build Coastguard Workerwithout blocking the current thread. Effectively, this can be achieved by 5*cc02d7e2SAndroid Build Coastguard Workerconverting the gRPC Python streaming API into callback-based. 6*cc02d7e2SAndroid Build Coastguard Worker 7*cc02d7e2SAndroid Build Coastguard WorkerIn this example, the RPC service `Phone` simulates the life cycle of virtual 8*cc02d7e2SAndroid Build Coastguard Workerphone calls. It requires one thread to handle the phone-call session state 9*cc02d7e2SAndroid Build Coastguard Workerchanges, and another thread to process the audio stream. In this case, the 10*cc02d7e2SAndroid Build Coastguard Workernormal blocking style API could not fulfill the need easily. Hence, we should 11*cc02d7e2SAndroid Build Coastguard Workerasynchronously execute the streaming RPC. 12*cc02d7e2SAndroid Build Coastguard Worker 13*cc02d7e2SAndroid Build Coastguard Worker## Steps to run this example 14*cc02d7e2SAndroid Build Coastguard Worker 15*cc02d7e2SAndroid Build Coastguard WorkerStart the server in one session 16*cc02d7e2SAndroid Build Coastguard Worker``` 17*cc02d7e2SAndroid Build Coastguard Workerpython3 server.py 18*cc02d7e2SAndroid Build Coastguard Worker``` 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard WorkerStart the client in another session 21*cc02d7e2SAndroid Build Coastguard Worker``` 22*cc02d7e2SAndroid Build Coastguard Workerpython3 client.py 23*cc02d7e2SAndroid Build Coastguard Worker``` 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Worker## Example Output 26*cc02d7e2SAndroid Build Coastguard Worker``` 27*cc02d7e2SAndroid Build Coastguard Worker$ python3 server.py 28*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Server serving at [::]:50051 29*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Received a phone call request for number [1415926535] 30*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Created a call session [{ 31*cc02d7e2SAndroid Build Coastguard Worker "sessionId": "0", 32*cc02d7e2SAndroid Build Coastguard Worker "media": "https://link.to.audio.resources" 33*cc02d7e2SAndroid Build Coastguard Worker}] 34*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Call finished [1415926535] 35*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Call session cleaned [{ 36*cc02d7e2SAndroid Build Coastguard Worker "sessionId": "0", 37*cc02d7e2SAndroid Build Coastguard Worker "media": "https://link.to.audio.resources" 38*cc02d7e2SAndroid Build Coastguard Worker}] 39*cc02d7e2SAndroid Build Coastguard Worker``` 40*cc02d7e2SAndroid Build Coastguard Worker 41*cc02d7e2SAndroid Build Coastguard Worker``` 42*cc02d7e2SAndroid Build Coastguard Worker$ python3 client.py 43*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Waiting for peer to connect [1415926535]... 44*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Call toward [1415926535] enters [NEW] state 45*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Call toward [1415926535] enters [ACTIVE] state 46*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Consuming audio resource [https://link.to.audio.resources] 47*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Call toward [1415926535] enters [ENDED] state 48*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Audio session finished [https://link.to.audio.resources] 49*cc02d7e2SAndroid Build Coastguard WorkerINFO:root:Call finished! 50*cc02d7e2SAndroid Build Coastguard Worker``` 51