Пересчёт агрегатов в четырёх потоках не ускорился: в чём причина
Сервис считает сводку по выгрузке: данные уже в памяти, идёт чистый Python-перебор и арифметика, без обращений к сети и диску. Расчёт разложили на четыре потока через ThreadPoolExecutor(max_workers=4). Время выполнения не изменилось, а на части запусков стало чуть хуже.
Что здесь происходит?
- Потоки в Python не настоящие потоки ОС, они эмулируются внутри процесса
- Четырёх потоков мало для заметного эффекта, нужно ставить максимум по числу ядер, умноженному на восемь
- Из-за GIL байт-код в один момент времени исполняет один поток; для счётной задачи нужен пул процессов
- Функцию нужно объявить как async def — тогда расчёты пойдут одновременно
