Вступить в клуб →
средняявопросPython и асинхронность

Пересчёт агрегатов в четырёх потоках не ускорился: в чём причина

Сервис считает сводку по выгрузке: данные уже в памяти, идёт чистый Python-перебор и арифметика, без обращений к сети и диску. Расчёт разложили на четыре потока через ThreadPoolExecutor(max_workers=4). Время выполнения не изменилось, а на части запусков стало чуть хуже.

Что здесь происходит?

  • Потоки в Python не настоящие потоки ОС, они эмулируются внутри процесса
  • Четырёх потоков мало для заметного эффекта, нужно ставить максимум по числу ядер, умноженному на восемь
  • Из-за GIL байт-код в один момент времени исполняет один поток; для счётной задачи нужен пул процессов
  • Функцию нужно объявить как async def — тогда расчёты пойдут одновременно

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела