Middle Python-кандидат проходит тестовое интервью, целиком посвящённое конкурентности. После представления интервьюер просит сравнить синхронный и асинхронный код, объяснить I/O-bound задачи и ожидание операций. Затем кандидат разбирает разницу потоков и процессов, общую память потоков, GIL и способы его обхода. Отдельно обсуждаются выбор между потоками, процессами и async/await, переключение в асинхронном коде и ситуации, где усложнение вообще не нужно. В финале кандидат отвечает о race condition и синхронизации общего состояния, разбирает код с подвохом и получает обратную связь по уровню ответов.
Потоки одного процесса разделяют память, тогда как процессы имеют отдельные адресные пространства.
Для I/O-bound операций обычно используют потоки или асинхронный ввод-вывод; CPU-bound работу в CPython часто выносят в отдельные процессы с учётом ресурсов и результатов замеров.
В обычной сборке CPython GIL не позволяет нескольким потокам одновременно исполнять Python-байткод, но не мешает перекрывать I/O-ожидание.
Race condition возникает при некоординированном доступе к общему изменяемому состоянию; её предотвращают синхронизацией или отказом от такого состояния.