Есть ли способ определить, работает ли цикл событий asyncio на полную мощность? - PullRequest
6 голосов
/ 20 сентября 2019

Я запускаю асинхронное приложение, которому требуется более одного цикла обработки событий для обслуживания большого количества операций ввода-вывода (более тысячи одновременно).Циклы событий выполняются в отдельном потоке и бесконечно зацикливаются на сопрограммах по мере их отправки.

Я ищу способ определить, когда существующий цикл событий заполнен почти полностью, чтобы я мог запустить новое событиеПоток цикла по требованию, вместо того, чтобы предварительно указывать, сколько циклов событий я хочу запустить.

Близкая емкость означает, что цикл событий будет занят, скажем, 80% + времени.Если цикл обработки тратит менее 20% своего времени в состоянии ожидания, пришло время добавить другой поток цикла событий.

Не похоже, что это легко для потока: Профиль PythonЗагрузка процессора по потокам

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Я ищу способ определить, когда существующий цикл событий почти заполнен, чтобы я мог запустить новый поток цикла событий

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

Если ваши циклы событий слишком загружают ЦПсвязанных с работой (например, вычисления), вы должны переместить эти отдельные единицы работы в отдельные потоки, используя run_in_executor.Если этого недостаточно, вы можете попробовать переключиться на uvloop , высокопроизводительную замену асинхронного асинхронного ввода для CPython.Вы также можете попробовать asyncio с PyPy .

Если ни один из этих параметров не работает, следующая вещь, которую нужно попробовать, это какой-то вариант многопроцессорной обработки.(Или более низкоуровневый / ориентированный на производительность язык.)

1 голос
/ 21 сентября 2019

Если вы хотите использовать больше доступных машинных ресурсов, проще добиться делегирования этой работы внешнему супервизору , который управляет несколькими процессами Python.

И порождение большего количества процессов при ограничении емкости звучит какчто-то балансировщик нагрузки должен сделать.

Передача этой работы (проверок) проверенным временем решениям, кажется, лучший выбор, чем написать свою собственную на Python (де-факто).Я также скептически отношусь к идее смешивать бизнес-логику приложения с деталями, связанными с развертыванием, которые могут меняться в зависимости от конкретной серверной инфраструктуры.

aiohttp имеет приятное руководство базового процесса развертывания.

...