#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. Возможно, сервер, на который я отправлял запросы, на самом деле плохо обрабатывал одновременные запросы.