Использование клиента Python gRPC из ThreadPoolExecutor - PullRequest
2 голосов
/ 15 апреля 2019

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

Есть идеи?

...