перехватчик действительно запускается в обслуживающем потоке, который отличается от потока обработки.Обслуживающий поток отвечает за обслуживание обслуживающих и перехватывает обработчики обслуживающих устройств.После того, как обработчик метода serverer будет возвращен перехватчиками, обслуживающий поток отправит его в thread_pool
at _server.py # L525 :
# Take unary unary call as an example.
# The method_handler is the returned object from interceptor.
def _handle_unary_unary(rpc_event, state, method_handler, thread_pool):
unary_request = _unary_request(rpc_event, state,
method_handler.request_deserializer)
return thread_pool.submit(_unary_response_in_pool, rpc_event, state,
method_handler.unary_unary, unary_request,
method_handler.request_deserializer,
method_handler.response_serializer)
Что касается обходного пути, я могутолько представьте, что передаете экземпляр хранилища как перехватчику, так и серверу во время инициализации.После этого хранилище можно использовать как переменную-член.
class StorageServerInterceptor(grpc.ServerInterceptor):
def __init__(self, storage):
self._storage = storage
def intercept_service(self, continuation, handler_call_details):
key = ...
value = ...
self._storage.set(key, value)
...
return continuation(handler_call_details)
class Storage(...StorageServicer):
def __init__(self, storage):
self._storage = storage
...Servicer Handlers...