@LakeForest

Как решить ошибку RuntimeWarning: coroutine 'TestService.Method' was never awaited (grpc.aio)?

# сложная операция, занимающая время и cpu/gpu
def long_process(value):
    ...
    # time.sleep(2)
    result = ...
    return result

class TestService(test_pb2_grpc.SpeechToTextService):
    async def Method(self, request: Request, context: grpc.aio.ServicerContext):
        start = time.time()
        value= request.value
        ...
        result = await long_process(value)
        ...
        return Response(result = result, duration=time.time()-start)
        
async def main(address: str):
    server = grpc.aio.server(futures.ThreadPoolExecutor())
    test_pb2_grpc.add_TestServiceServicer_to_server(
        TestService(), server
    )
    server.add_insecure_port(address)
    await server.start()
    await server.wait_for_termination()

if __name__ == "__main__":
    asyncio.run(main("localhost:8000"))

При вызове метода возникает ошибка:

/usr/local/lib/python3.7/asyncio/events.py:88: RuntimeWarning: coroutine 'TestService.Method' was never awaited
backend_1 | self._context.run(self._callback, *self._args)

Можете подсказать из-за чего эта ошибка, как исправить?
И получится ли таким образом ускорить процесс обработки запроса, чтобы на fastapi не блокировался endpoint?

Пытался найти решение, часто показывают такой пример и такой. Но не понимаю, чем мой хуже.

UPD: снова перезапустил сервис. Заработало, но не возвращает результат обработки... Клиенту не приходит ответ result...
На клиенте:
@router.post("/test)
async def test(
        request: TestRequest
):
    response = await send_request(request.value)
    if not response:
        raise HTTPException('Ответ от grpc не был получен')
    return JSONResponse(
        content=response
    )

Но если напишу так, то снова возвращается ошибка "coroutine 'TestService.Method' was never awaited":
class TestService(test_pb2_grpc.SpeechToTextService):
    async def Method(self, request: Request, context: grpc.aio.ServicerContext):
        start = time.time()
        value= request.value
        ...
        result = await long_process(value)
        ...
        return Response(result = result.result(), duration=time.time()-start)
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
stympel
@stympel
подпивасник
Где то не вызываешь Method через await.
А вообще если хочешь возвращать время выполнения запроса, юзай мидлтварь.
@api.middleware("http")
async def add_process_time_header(request: Request, call_next: Callable):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Будет тебе в заголовке писать время работы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы