grpc-Python max_workers ограничение количества одновременных процессов

при использовании сервера python grpc,

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

это общий способ создания экземпляра сервера grpc. Но при этом, если я попытаюсь запустить более 10 экземпляров клиента, который ожидает потоковую передачу сервера, 11-й не будет работать (у меня запущено 10 экземпляров клиента, которые подключаются к этому серверу и получают поток)

Даже если я изменю max_workers на None, max будет создано 40 потоков (8 ядер x 5 согласно документации), так что в этом случае одновременно может обслуживаться не более 40 клиентов.
Это ожидаемое поведение?

Я работал над своим кодом, но попытался использовать общий код python grpc, описанный здесь:

https://grpc.io/docs/tutorials/basic/python.html

Я могу воспроизвести ту же проблему с этим.

Чтобы воспроизвести это, просто запустите route_guide_server.py в одном окне с max_workers = 4, а затем попробуйте запустить 4-5 разных клиентов в разных окнах. Четвертому клиенту придется дождаться завершения работы одного из клиентов. (Чтобы улучшить обзор, добавьте time.sleep в yield)

Если большое количество клиентов (100 и 1000 клиентов) хотят получить доступ к серверу grpc на Python с потоковой передачей (которая должна быть непрерывной), то у клиентов больше никогда не будет шансов.


person Tushar Seth    schedule 25.03.2019    source источник


Ответы (1)


Да, это ожидаемое поведение.

После запуска моего собственного тестового кода, да, если вы предоставите аргумент None для max_workers, тогда 40 - это максимум. Однако, если я установлю максимальное значение 100, то, конечно же, у меня может быть не более 100 одновременных рабочих. Это ожидаемое поведение, потому что пул потоков создается на основе количества запрошенных рабочих. Вы не можете ожидать, что, если вы не предоставите максимальное количество воркеров, он будет просто масштабироваться вверх и вниз во время выполнения. Не обошлось и без изменения пула потоков grpc и concurrent Futures. С учетом того, как интерфейс связан, в python grpc прямо сейчас мы должны использовать параллельный пул потоков Futures, поэтому мы должны предоставить аргумент max_workers, если мы хотим, чтобы он был больше 40, и он должен быть установлен во время компиляции.

person Kevin S    schedule 26.03.2019
comment
Привет, Кевин, Спасибо за ответ. В этой связи я хочу спросить две вещи: 1) это поведение только для python grpc? как и в других реализациях grpc, таких как go, я ничего подобного не видел (здесь нам не нужно указывать no of thread). Итак, означает ли это, что он автоматически масштабируется в этих реализациях grpc? 2) Если это так для python grpc, есть ли способ масштабировать это для производства? Скажем, сначала подключается 100-200 клиентов, но позже, если вдруг будет создано около 5000-7000 клиентов, приложение выйдет из строя, правильно? - person Tushar Seth; 27.03.2019
comment
Хорошие вопросы. К сожалению, в настоящее время я не использовал grpc ни для чего, кроме Python. Если у меня в ближайшее время появится время, я мог бы попробовать сделать что-нибудь в go, чтобы проверить ваш вопрос, но поскольку go так хорошо ориентирован на параллелизм, а горутины используют такой небольшой объем памяти, меня совсем не удивит, если go grpc автоматически масштабируется. Потоки Python используют потоки ОС, которые на порядок больше памяти. Масштабирование этого очень возможно, но это может очень быстро усложниться. Например, вы можете использовать балансировку нагрузки, когда дополнительные серверы grpc готовы к раскрутке, когда .... - person Kevin S; 27.03.2019
comment
обнаружение, что все потоки в пуле потоков используются. grpc python имеет отражение, поэтому я уверен, что есть способы, которыми вы можете либо использовать grpc python, чтобы узнать, сколько потоков осталось, либо отслеживать его самостоятельно. Вы можете создать систему, которая будет запускать новые серверы grpc по запросу. Если ваши требования позволяют, вы можете упростить его и закрыть все текущие соединения, запустить новый сервер с большим количеством потоков. Для многих приложений это неприемлемо. В дорожной карте python grpc они планируют поддерживать asyncio, что может сделать эту проблему спорной. - person Kevin S; 27.03.2019