Какие способы запуска параллельного выполнения существуют в Python
Что проверяют
Понимаете ли вы, что выбор диктуется типом задачи, и знаете ли, что даёт каждый способ.
Как отвечать
Четыре основных способа, и выбор между ними определяется тем, ждёт задача или считает.
1. Потоки. Настоящие потоки операционной системы, но глобальная блокировка не даёт им исполнять байткод одновременно. Выигрыш есть только на ожидании: блокировка отпускается на время системного вызова. Годится для сетевых запросов через синхронные библиотеки и работы с файлами.
2. Процессы. У каждого свой интерпретатор и своя блокировка, поэтому это единственный способ считать параллельно на нескольких ядрах. Плата это стоимость запуска и передача данных между процессами через сериализацию: обмен большими объектами может съесть весь выигрыш.
3. Пулы через единый интерфейс. Пул потоков и пул процессов дают одинаковый API с отправкой задач и получением результатов. Удобно тем, что переключение между потоками и процессами это правка одной строки, и можно замерить оба варианта.
4. Асинхронность. Один поток и кооперативное переключение в точках ожидания. Тысячи одновременных сетевых соединений обходятся дешевле тысяч потоков. Но требует асинхронных библиотек: один синхронный вызов останавливает всё.
Дополнительно стоит назвать:
- библиотеки на C, которые сами отпускают блокировку на время вычислений. Векторная операция в численном пакете уже параллельна, и часто это лучший ответ, чем ручное распараллеливание;
- внешние процессы через запуск подпроцессов;
- распределённые системы вроде очередей задач, Dask и Ray, когда одной машины мало;
- экспериментальный режим сборки без глобальной блокировки в версии 3.13 и субинтерпретаторы: направление, в котором это движется.
Правило выбора: ждём, значит асинхронность или потоки; считаем, значит процессы или библиотека на C.
Где спотыкаются
Берут потоки для вычислений.
Передают между процессами огромные объекты и теряют весь выигрыш.
Смешивают асинхронный код с синхронными библиотеками.
Не пробуют сначала векторизацию, сразу берясь за многопроцессность.