Использование клиента Python gRPC из ThreadPoolExecutor

#python #python-multithreading #grpc #concurrent.futures

#python #python-многопоточность #grpc #concurrent.futures

Вопрос:

Я хотел бы ускорить некоторую обработку, отправив несколько запросов gRPC от клиента Python и ожидая ответа. Похоже, это было concurrent.futures.ThreadPoolExecutor бы неплохо, поскольку это будет в основном работа с вводом-выводом. Но, похоже, клиент gRPC никогда не выпускает GIL, и я не могу добиться какого-либо ускорения.

Мой код выглядит примерно так

 def do_call():
    return stub.Call(something)

futures = []
thread_pool = concurrent.futures.ThreadPoolExecutor(workers=10)
for _ in range(100):
    futures.append(thread_pool.submit(do_call))

for future in concurrent.futures.as_completed(futures):
    print(future.result())
  

В конце концов, это происходит медленнее, чем просто синхронный вызов метода 100 раз. Что я могу делать неправильно? Я пытался использовать один канал и создавать отдельную заглушку для каждого запроса, но это ничего не изменило.

Я знаю, что у заглушки есть stub.Call.future() метод, который я мог бы использовать. Моя проблема в том, что do_call() функция на самом деле довольно сложная, и я хочу избежать необходимости переписывать всю обработку для обратного вызова в будущем.

Есть идеи?

Комментарии:

1. Как вы это решили? Не могли бы вы поделиться примером клиентского кода. Я новый программист на python и хочу отправить несколько запросов gRPC и обработать ответы потока.

2. Я думаю, что в моей настройке было что-то не так, когда я опубликовал этот вопрос. Я не думаю, что в коде есть какая-либо ошибка или проблема с gRPC. Возможно, сервер, на который я отправлял запросы, на самом деле плохо обрабатывал одновременные запросы.