Я хотел бы ускорить некоторую обработку, посылая несколько запросов 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()
на самом деле довольно сложная, и я хочу избежать необходимости переписывать всю обработку в качестве обратных вызовов в будущем.
Есть идеи?