Что такое синхронность, многопоточность и многопроцессорность
Что проверяют
Умеете ли вы выбирать модель исполнения под задачу. В Python это не теория: из-за глобальной блокировки интерпретатора потоки и процессы дают принципиально разный результат, и проверяют, знаете ли вы, какой именно.
Как отвечать
Разложите на уровни.
Синхронное выполнение: одна последовательность шагов, следующий после предыдущего. Предсказуемо и просто, но пока код ждёт ответа сети, он не делает ничего полезного.
Многопоточность (threading, ThreadPoolExecutor): несколько потоков в одном процессе с общей памятью. В CPython байт-код в каждый момент исполняет один поток, потому что глобальную блокировку держит кто-то один. Отпускается она на операциях ввода-вывода, поэтому потоки выигрывают там, где программа ждёт: запросы, диск, база.
Многопроцессорность (multiprocessing, ProcessPoolExecutor): отдельные процессы со своими интерпретаторами. Ограничение снимается, счёт идёт параллельно, но за обмен данными платят сериализацией, а за запуск процесса временем и памятью.
Отдельно упомяните asyncio: конкурентность без потоков, одна нить и много ожиданий, снова только для ввода-вывода.
Критерий выбора называйте прямо: ждём внешние системы это потоки или asyncio, считаем сами это процессы, задача короткая и одна это обычный синхронный код.
Где спотыкаются
Ускоряют потоками счётную задачу и получают то же время или хуже. Параллельного счёта не возникает, а переключения контекста и борьба за блокировку добавляют накладные расходы.
Переносят на процессы код с общим состоянием. Глобальные переменные не разделяются, аргументы и результаты обязаны быть сериализуемыми, незакрытый пул оставляет висящие процессы, а передача больших массивов через очередь съедает весь выигрыш.
Повторяют про глобальную блокировку как про вечный закон. В современных версиях появился экспериментальный режим сборки без неё, и упомянуть это стоит: показывает, что вы следите за языком, а решение всё равно принимается по конкретному интерпретатору в проде.