# gRPC Python Async Interceptor Example This example demonstrate the usage of Async interceptors and context propagation using [contextvars](https://docs.python.org/3/library/contextvars.html#module-contextvars). ## When to use contextvars `Contextvars` can be used to propagate context in a same thread or coroutine, some example usage include: 1. Propagate from interceptor to another interceptor. 2. Propagate from interceptor to the server handler. 3. Propagate from client to server. ## How does this example works This example have the following steps: 1. Generate RPC ID on client side and propagate to server using `metadata`. * `contextvars` can be used here if client and server is running in a same coroutine (or same thead for Sync). 2. Server interceptor1 intercept the request, it checks `rpc_id_var` and decorate it with it's tag `Interceptor1`. 3. Server interceptor2 intercept the request, it checks `rpc_id_var` and decorate it with it's tag `Interceptor2`. 4. Server handler receives the request with `rpc_id_var` decorated by both interceptor1 and interceptor2. ## How to run this example 1. Start server: `python3 -m async_greeter_server_with_interceptor` 2. Start client: `python3 -m async_greeter_client` ### Expected outcome * On client side, you should see logs similar to: ``` Sending request with rpc id: 59ac966558b3d7d11a06bd45f1a0f89d Greeter client received: Hello, you! ``` * On server side, you should see logs similar to: ``` INFO:root:Starting server on [::]:50051 INFO:root:Interceptor1 called with rpc_id: default INFO:root:Interceptor2 called with rpc_id: Interceptor1-59ac966558b3d7d11a06bd45f1a0f89d INFO:root:Handle rpc with id Interceptor2-Interceptor1-59ac966558b3d7d11a06bd45f1a0f89d in server handler. ```