async, threading и multiprocessing в Python
Когда использовать async, threading и multiprocessing в Python, и как GIL влияет на этот выбор?
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
async/threading подходят для I/O-bound задач, multiprocessing - для CPU-bound Python кода; GIL мешает параллельному исполнению Python bytecode в threads.
Полный разбор
asyncio хорош, когда много сетевых или файловых ожиданий и код можно писать в cooperative style. Threads тоже удобны для I/O-bound задач, особенно когда библиотека блокирующая, но GIL не дает двум Python threads одновременно исполнять CPU-bound bytecode.
Для CPU-bound задач на чистом Python используют multiprocessing или выносят вычисления в native code, который освобождает GIL. В ML/NumPy/PyTorch часть операций выполняется в C/CUDA и может эффективно параллелиться вне GIL.
В production выбор зависит от нагрузки: web API с внешними calls - async/thread pool; тяжелый feature extraction на CPU - processes/queue; GPU inference - batching и отдельный worker pool.
Типичные ошибки
- Говорить, что threads всегда бесполезны из-за GIL.
- Использовать multiprocessing для легкого I/O.
- Не учитывать serialization overhead между processes.
Как отвечать на собеседовании
- Раздели I/O-bound и CPU-bound.
- Упомяни, что native ML libraries часто обходят GIL.