Что лучше использовать для вычисления геометрии: многопоточность или асинхронность в Python
Что проверяют
Отличаете ли вы задачи, упирающиеся в процессор, от задач, упирающихся в ожидание, и понимаете ли, что именно делает GIL. Вопрос с подвохом: правильный ответ в том, что ни один из двух названных вариантов задачу не решает.
Как отвечать
Вычисление геометрии, пересечения, буферы, триангуляция, это нагрузка на процессор. Значит:
- асинхронность не даёт ничего.
asyncioпереключает задачи только наawait, а в счётной функции точек переключения нет: одна такая корутина займёт цикл событий целиком, и остальные задачи встанут; - потоки в CPython не считают параллельно. GIL отдаётся на границах байткода и на блокирующих вызовах, поэтому четыре потока чистого Python суммарно дадут скорость одного плюс накладные расходы на переключение.
Что работает на самом деле:
- векторизация:
numpyиshapelyуносят цикл в C, и это обычно даёт больше, чем любое распараллеливание кода на Python; - процессы:
ProcessPoolExecutorпо числу ядер, данные передаются крупными порциями, а не по точке; - потоки, если библиотека отпускает GIL: многие операции
numpyи геометрические вызовы через C-расширение это делают, тогда потоки считают параллельно и без затрат на пересылку данных.
Итоговая формулировка: сначала измерить и векторизовать, потом процессы по числу ядер, асинхронность оставить сетевому слою вокруг расчёта.
Где спотыкаются
Ставят async def на счётную функцию и ждут ускорения. Асинхронность это не параллелизм, а способ не простаивать на ожидании; без ожидания она добавляет только накладные расходы на планировщик.
Второе: забывают про цену передачи данных в процессы. Аргументы и результат проходят через pickle, и на мелких задачах пересылка съедает всю выгоду. Лечится укрупнением порции и параметром chunksize.
Третье: строят ответ на том, что GIL скоро уберут. Сборка без GIL существует в экспериментальном виде, но на прикладном проекте это не аргумент: часть расширений там просто небезопасна, а однопоточный код местами становится медленнее.