Я новичок в программировании на Python. Большая часть моего кода использует asyncio, поскольку я делаю вызовы ввода-вывода к базе данных, хотя в некоторых случаях я использую неасинхронные методы, которые работают долго, как и несколько вызовов платформы Pandas к базе данных, поэтому для Чтобы избежать вызова блокировки, который ограничивает масштабируемость, я использую concurrent.futures.ThreadPoolExecutor для выполнения метода блокировки следующим образом:
Код: Выделить всё
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
values = executor.map(func, data)
Приведенная выше функция обеспечивает сбор данных максимальной длиной 2, что в основном требует не более 2 потоков, но когда приходит несколько пользователей и приложение необходимо масштабировать , в то время каким должно быть идеальное значение max_workers:
Изменено в версии 3.8. : значение max_workers по умолчанию изменено на min(32, os.cpu_count() + 4). Это значение по умолчанию сохраняет как минимум 5 рабочих процессов для задач, связанных с вводом-выводом. Он использует не более 32 ядер ЦП для задач, связанных с ЦП, которые освобождают GIL. И это позволяет избежать неявного использования очень больших ресурсов на многоядерных машинах.
- Не упомянуть ли об этом? вообще, и его можно создать по требованию.
Основной вопрос остается: если 10 пользователей начнут выполнять одну и ту же операцию, будут ли они в конечном итоге использовать один и тот же ThreadPoolExecutor< /code>(общий) или они в конечном итоге получают другой исполнитель, поскольку это не общий объект. Я хотел убедиться, что при масштабировании приложение не пострадает из-за неправильного дизайна
Подробнее здесь:
https://stackoverflow.com/questions/667 ... ing-up-the